如何正确截断双精度

vol*_*ing 0 java precision truncate

如何在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
Run Code Online (Sandbox Code Playgroud)

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

使用BigDecimal具有arbitary精度

BigDecimal bd = new BigDecimal("0.9999999999999999999999999999");
bd = bd.setScale(0, BigDecimal.ROUND_DOWN); //truncate
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 7

1.99999999999999999没有四舍五入2,它 2.

System.out.println(1.999999999999999999);      // 2
System.out.println(1.999999999999999999 == 2); // true
Run Code Online (Sandbox Code Playgroud)

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

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

  • @volting BigDecimal可以将新的BigDecimal("1.999999999999999999")与两个区分开来,完全代表它并正确打印.引用的文章使用Double而不是BigDecimal来解析字符串,这样新的BigDecimal只能有一个可以用double精确表示的值. (3认同)