双值随机增加

时间:2014-06-01 00:20:15

标签: java

双倍值随机增加。

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)

输出并不相同,只是其中的一种。

但是,我只想要确切的值。我该怎么办?

4 个答案:

答案 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仍会出现舍入错误 - 这是不可避免的 - 但舍入错误不会影响循环计数。