如何在Java中正确截断double值,例如,1.99999999999999999总是被截断为1,而不是像下面的示例中那样向上舍入为2。

    double d1 = 1.999999999999999999;
    double d2 = 1.0;
    long i1 = (long)Math.floor(d1);
    long i2 = (long)Math.floor(d2);
    System.out.println("i1="+i1 + " i2="+i2); //i1 == 2


在此处运行示例:http://www.browxy.com/SubmittedCode/42603



使用具有精确度的BigDecimal

BigDecimal bd = new BigDecimal("0.9999999999999999999999999999");
bd = bd.setScale(0, BigDecimal.ROUND_DOWN); //truncate

最佳答案

1.99999999999999999不四舍五入为2,而是2

System.out.println(1.999999999999999999);      // 2
System.out.println(1.999999999999999999 == 2); // true


浮点数不是无限精确的。 Java使用的存储格式(IEEE double)中没有足够的位来区分1.9999999999999999992

如果您需要的精度更高,请尝试使用其他数字格式,例如BigDecimal

09-10 01:33
查看更多