Неточные вычисления в Java
В битах дробь собирается из половин, четвертей,
восьмых и таких же следующих долей. Если число
складывается из этих долей без хвоста, оно лежит
в памяти точно. 0.5 - это половина,
0.25 - четверть:
System.out.println(0.5 + 0.25);
Десятая доля из таких кусков не складывается.
В десятичной записи не кончается 1/3,
в битах так же не кончается 0.1.
В double помещается ближайшее значение
примерно на 15 значащих цифр. У float
цифр около 7. На экран 0.1 часто
выходит коротко, потому что печать подбирает
краткую десятичную запись:
System.out.println(0.1);
Зазор проявляется в действии. Складываются не написанные десятые, а те значения, которые реально лежат в байтах:
System.out.println(0.1 + 0.2);
Вычитание устроено так же:
System.out.println(0.3 - 0.1);
Дан код:
double num1 = 0.1;
double num2 = 0.7;
Найдите сумму этих переменных и выведите ее.
Посмотрите, совпадает ли вывод с 0.8.
Дан код:
double num1 = 0.1;
double num2 = 0.2;
Найдите сумму этих переменных и выведите ее.
Посмотрите, совпадает ли вывод с 0.3.
Дан код:
double num1 = 0.25;
double num2 = 0.25;
Найдите сумму этих переменных и выведите ее.
Посмотрите, совпадает ли вывод с 0.5.