我这里有一个简单的代码,但它没有任何划分或复杂的乘法。
for ( double i=.1; i<=1; i+=.1) {
System.out.println(i);
}
但在某些情况下i
的值不准确,例如.79999999
或.600000001
。
为什么会这样?如何更改准确的代码?
答案 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));
}