我正在研究java中的一个程序,它需要在一个双变量ex中添加一个小的常量值,如0.00000000001。地点。但是,当我运行代码,调试它,并到达我将0.00000000001添加到位置的位置,并在添加发生后检查调试模式中的位置值。看来该位置没有添加0.00000000001。例如,位置在添加前等于438.0,在添加后等于438.0。以下是简单代码的示例
位置+ = 0.00000000001
有什么想法吗?提前谢谢。
答案 0 :(得分:6)
由于Java的存储方式,许多双精度值在Java中并不完全准确。精确精度仅适用于某些值。这是因为Java只能将十进制值存储为多个2 ^ n(s)的组合。
例如:1/4
可以存储为2^-2
,但1/3
将存储为2^-2 + 2^-3+ 2^-4 +2^-5...
,因此1/3
是值的示例不完全准确
如果您想要精确值,请使用BigDecimal
类:
http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
答案 1 :(得分:5)
您需要使用BigDecimal才能获得更好的精确度。
示例:
BigDecimal test = new BigDecimal(438.0);
test = test.add(new BigDecimal(0.0000000000001));
System.out.println(test);
答案 2 :(得分:4)
使用BigDecimal类。它具有任意精度,并且能够处理微小的值。
答案 3 :(得分:2)
如果超过double
的精度,添加一个非常小的值就什么都不做。
for (double d = 438; d < 1e7; d *= 10) {
double location = d;
location += 0.00000000001;
System.out.println(location);
}
打印
438.00000000001
4380.00000000001
43800.00000000001
438000.0
4380000.0
答案 4 :(得分:1)
您可能遇到了舍入错误或下溢。我尝试使用BigDecimal来获得任意精度。
答案 5 :(得分:1)
你应该阅读http://firstclassthoughts.co.uk/java/traps/java_double_traps.html
这将介绍java如何存储和处理双精度和浮点数以及它们在使用和比较它们时的含义。
这基本上是“你看不出什么”的情况
如果您决定使用大小数,则会有自己的陷阱案例
http://firstclassthoughts.co.uk/java/traps/big_decimal_traps.html
这真的归结为你想要添加0.00000000001 ??
答案 6 :(得分:0)
还有一件事要添加到另一个答案中。问题不在于价值太小。更大的价值=更大的不公平。查看示例:
float x = 20000000.0f;
for (int i = 0; i < 10000000; i++) {
x += 1;
}
System.out.println(x); // prints 20000000.0f, not 30000000.0f!
因此,如果在循环中使用浮点数,则永远不能退出此循环