Двойное значение увеличивается случайным образом

1

Двойное значение увеличивается случайным образом.

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
    Может быть, вы должны использовать < вместо <= .
Показать ещё 3 комментария
Теги:

4 ответа

1
Лучший ответ

Вы можете использовать целочисленный счетчик и умножить, чтобы получить double:

for(int i = -10; i <= 10; i++) {
  double iDouble = 0.1 * i;
  ....
}

У double все равно будет ошибка округления - это неизбежно, но ошибка округления не повлияет на количество циклов.

1

Как сказано здесь, переменные с плавающей запятой не должны использоваться как счетчики циклов. Лимитированные типы IEEE 754 с плавающей точкой не могут представлять:

  • все простые дроби точно
  • все десятичные числа точно, даже когда десятичные знаки могут быть представлены в небольшом числе цифр.
  • все цифры больших значений, означающие, что приращение большого значения с плавающей запятой не может изменить это значение в пределах доступной точности.

(...) Использование счетчиков циклов с плавающей запятой может привести к неожиданному поведению.

Вместо этого используйте целочисленный счетчик циклов и добавьте еще одну переменную внутри этого цикла следующим образом:

for (int count = 1; count <= 20; count += 1) {
  double x = -1 + count * 0.1;
  /* ... */
}
1

Вы не можете получить точные значения в отношении ограничений удвоения. Они не всегда могут точно представлять нужную десятичную цифру, и они имеют точность ошибок. В вашем случае вы можете использовать двойное значение для int для двойного сравнения, но поскольку @alex сказал, что вы не должны этого делать.

1

Это связано с тем, что удваивается память в памяти, они точны, если дробная часть является отрицательной мощностью двух, например, 0, 1/2, 1/4 и т.д. Именно поэтому вы никогда не должны использовать равенство для двухлокальных, а>> и <. Для точных вычислений вы можете использовать BigDecimal:

BigDecimal bigDecimal = new BigDecimal(123.45);
bigDecimal = bigDecimal.add(new BigDecimal(123.45));
System.out.println(bigDecimal.floatValue()); // prints 246.9
  • 0
    Точнее, если дробная часть представляет собой целое число, умноженное на степень два. 3.0 / 4.0 это точно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню