是否有任何在java中截断double的函数?

21 java

是否有Java库函数可用于将数字截断为任意数量的小数位?例如.

SomeLibrary.truncate(1.575, 2) = 1.57
Run Code Online (Sandbox Code Playgroud)

谢谢

rao*_*son 28

尝试使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • 2 条评论:`BigDecimal` 已经有一个采用`Double` 的构造函数。OP 似乎也不想将它四舍五入,而只是为了截断(地板)它。 (2认同)

Esk*_*sko 14

令人难以置信的是,没有人提出这个问题,Java API 现在已经有了很多年的DecimalFormat用于这个目的.

  • 具体来说,对于给定的示例,代码看起来像这样:final DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2); df.format(1.575); 最后一个表达式返回一个必须转换回double的String. (3认同)

Ste*_*all 6

对于大多数数字,xxx.yyyy除非使用具有保证精度的十进制类,否则您将无法获得精确的表示,例如BigDecimal.

  • 更重要的是,双打不具有*小数位,因为它们存储为二进制分数. (3认同)

Nat*_*hes 5

公共数学中有一个.查看http://commons.apache.org/math/apidocs/org/apache/commons/math/util/MathUtils.html:

public static double round(double x,
                           int scale)
Run Code Online (Sandbox Code Playgroud)

它是使用BigDecimal实现的,并且被重载以允许指定舍入方法,因此您可以使用它来截断,如下所示:

org.apache.commons.math.util.MathUtils.round(1.575, 2, 
    java.math.BigDecimal.ROUND_DOWN);
Run Code Online (Sandbox Code Playgroud)

更新:

在最后一个版本(Math3)中,此方法在类中Precision. org.apache.commons.math3.util.Precision.round(double x, int scale, int roundingMethod)


Edg*_*eal 5

只需删除小数部分:

public double trunk(double value){
    return value - value % 1;
}
Run Code Online (Sandbox Code Playgroud)