双倍值随机增加。
for(double i=-1;i<=1;i+=0.1)
{
for(double j=-1;j<=1;j+=0.1)
{
//logic
system.out.print(i);
system.out.print(j);
}
}
Here, the value comes like:
-1, -0.9, -0.8, -0.69, -0.51 ....-0.099 , 1.007 (WHY, U ARE GREATER THAN 1)
输出并不相同,只是其中的一种。
但是,我只想要确切的值。我该怎么办?
答案 0 :(得分:1)
您无法获得双精度限制的确切值。它们无法始终代表完全您想要的小数,并且它们具有精度错误。在您的情况下,您可能希望将double转换为int以进行双重比较,但正如@alex所说,您不应该这样做。
答案 1 :(得分:1)
这是由于双精度存储在存储器中的方式,它们仅在小数部分为2的负幂时才是精确的,例如, 0,1 / 2,1 / 4等。这也是为什么你永远不应该为双打使用等式语句,而是&gt;和&lt;。对于精确计算,您可以使用BigDecimal:
BigDecimal bigDecimal = new BigDecimal(123.45);
bigDecimal = bigDecimal.add(new BigDecimal(123.45));
System.out.println(bigDecimal.floatValue()); // prints 246.9
答案 2 :(得分:1)
如上所述here,浮点变量不能用作循环计数器。有限精度的IEEE 754浮点类型不能代表:
(...)使用浮点循环计数器可能会导致意外行为。
相反,使用整数循环计数器并在此循环内增加另一个变量,如下所示:
for (int count = 1; count <= 20; count += 1) {
double x = -1 + count * 0.1;
/* ... */
}
答案 3 :(得分:1)
您可以使用整数计数器,并乘以得到double:
for(int i = -10; i <= 10; i++) {
double iDouble = 0.1 * i;
....
}
double仍会出现舍入错误 - 这是不可避免的 - 但舍入错误不会影响循环计数。