Двойное значение увеличивается случайным образом.
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)
Выход не такой же, но вроде этого.
Но я хочу только точные значения. Что мне делать??
Вы можете использовать целочисленный счетчик и умножить, чтобы получить double:
for(int i = -10; i <= 10; i++) {
double iDouble = 0.1 * i;
....
}
У double все равно будет ошибка округления - это неизбежно, но ошибка округления не повлияет на количество циклов.
Как сказано здесь, переменные с плавающей запятой не должны использоваться как счетчики циклов. Лимитированные типы IEEE 754 с плавающей точкой не могут представлять:
(...) Использование счетчиков циклов с плавающей запятой может привести к неожиданному поведению.
Вместо этого используйте целочисленный счетчик циклов и добавьте еще одну переменную внутри этого цикла следующим образом:
for (int count = 1; count <= 20; count += 1) {
double x = -1 + count * 0.1;
/* ... */
}
Вы не можете получить точные значения в отношении ограничений удвоения. Они не всегда могут точно представлять нужную десятичную цифру, и они имеют точность ошибок. В вашем случае вы можете использовать двойное значение для int для двойного сравнения, но поскольку @alex сказал, что вы не должны этого делать.
Это связано с тем, что удваивается память в памяти, они точны, если дробная часть является отрицательной мощностью двух, например, 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
<
вместо<=
.