双加精确失去准确性

时间:2013-08-12 06:33:53

标签: java

我这里有一个简单的代码,但它没有任何划分或复杂的乘法。

for ( double i=.1; i<=1; i+=.1) {
      System.out.println(i);
}

但在某些情况下i的值不准确,例如.79999999.600000001

为什么会这样?如何更改准确的代码?

6 个答案:

答案 0 :(得分:2)

double是不精确的 - 它旨在保持有限的准确性。

要获得精确的“双打”,请使用BigDecimal

BigDecimal d = new BigDecimal(".1");
for ( BigDecimal i= d; ! i.equals(BigDecimal.ONE) ; i = i.add(d) {
    System.out.println(i);
}

答案 1 :(得分:2)

浮点数没有准确表示,它们会失去精度。尝试

for ( int i=1; i<=10; i+=1) {
      System.out.println("%.f", (double)i/10);
}

答案 2 :(得分:1)

在循环中使用int将解决问题:

for (int i=1;i<=10;i++) {
    System.out.println(i*0.1);
}

这种情况正在发生,因为小数部分可能会失去精确度,但它们并未完全表示。
您可能想知道What Every Computer Scientist Should Know About Floating-Point Arithmetic以获取更多信息。

答案 3 :(得分:1)

这是double的一个众所周知的属性。
双倍存储数字的格式为0.x * 2 ^ y(或1.x * 2 ^ x)。
这意味着并非所有整数都可以准确表示,最重要的是,并非所有小数部分都可以精确表示

我猜你应该在这里使用像BigDecimal这样的东西。

答案 4 :(得分:0)

这是因为浮点运算。如果您想要精确值,可以使用BigDecimal

等特殊类

答案 5 :(得分:0)

for (double i = .1; i <= 1; i += .1) {
    System.out.println(BigDecimal.valueOf(i).setScale(1, RoundingMode.HALF_UP));
}