是否有Java库函数可用于将数字截断为任意数量的小数位? 例如。
SomeLibrary.truncate(1.575, 2) = 1.57
由于
答案 0 :(得分:27)
尝试BigDecimal的setScale,如下所示:
public static double round(double d, int decimalPlace) {
BigDecimal bd = new BigDecimal(d);
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}
答案 1 :(得分:13)
令人难以置信的是,没有人提起这个问题,Java API现在已经有DecimalFormat用于此目的。
答案 2 :(得分:6)
对于大多数数字,除非使用保证准确性的十进制类,否则您将无法获得xxx.yyyy
的精确表示。
答案 3 :(得分:5)
在公共数学中有一个。查看 http://commons.apache.org/math/apidocs/org/apache/commons/math/util/MathUtils.html :
public static double round(double x,
int scale)
它是使用BigDecimal实现的,并且重载以允许指定舍入方法,因此您可以使用它来截断,如下所示:
org.apache.commons.math.util.MathUtils.round(1.575, 2,
java.math.BigDecimal.ROUND_DOWN);
<强>更新强>
在上一个版本(Math3)中,此方法位于类Precision
中。
org.apache.commons.math3.util.Precision.round(double x, int scale, int roundingMethod)
答案 4 :(得分:2)
这是一个简短的实现,比使用BigDecimal或Math.pow
快许多倍private static long TENS[] = new long[19];
static {
TENS[0] = 1;
for (int i = 1; i < TENS.length; i++) TENS[i] = 10 * TENS[i - 1];
}
public static double round(double v, int precision) {
assert precision >= 0 && precision < TENS.length;
double unscaled = v * TENS[precision];
if(unscaled < Long.MIN_VALUE || unscaled > Long.MAX_VALUE)
return v;
long unscaledLong = (long) (unscaled + (v < 0 ? -0.5 : 0.5));
return (double) unscaledLong / TENS[precision];
}
删除品味的断言。 ;)
答案 5 :(得分:2)
使用这个简单的功能
double truncateDouble(double number, int numDigits) {
double result = number;
String arg = "" + number;
int idx = arg.indexOf('.');
if (idx!=-1) {
if (arg.length() > idx+numDigits) {
arg = arg.substring(0,idx+numDigits+1);
result = Double.parseDouble(arg);
}
}
return result ;
}
答案 6 :(得分:2)
我只想添加到ubuntudroid的解决方案中。 我尝试了它,它不会向下舍入,所以我不得不添加
df.setRoundingMode(RoundingMode.FLOOR);
让它发挥作用。
答案 7 :(得分:2)
只需删除小数部分
public double trunk(double value){
return value - value % 1;
}
答案 8 :(得分:0)
要100%可靠地执行此操作,您必须将参数作为字符串传递,而不是作为浮点数传递。当以字符串形式给出时,代码很容易编写。原因是
double x = 1.1;
并不意味着x实际上会评估为1.1,而只是最接近的可精确表示的数字。
答案 9 :(得分:0)
实际上,这类事情很容易写出来:
public static double truncate(double value, int places) {
double multiplier = Math.pow(10, places);
return Math.floor(multiplier * value) / multiplier;
}
请注意,它是Math.floor,因为Math.round不会截断。
哦,这会返回一个double,因为这就是Math类中大多数函数返回的内容(如Math.pow和Math.floor)。
警告:双打很难准确。首先应考虑BigDecimal解决方案之一。答案 10 :(得分:-1)
创建了一种方法来实现它。
public double roundDouble(double d, int places) {
return Math.round(d * Math.pow(10, (double) places)) / Math.pow(10, (double)places);
}