Модуль Java 1 (%1) возвращает приблизительное значение

У меня есть пример кода

double k=3.14, l=0.5, m=1.3333;
        System.out.println(k+":"+k%1);
        System.out.println(l+":"+l%1);
        System.out.println(m+":"+m%1);

что приводит к выводу:

3.14:0.14000000000000012
0.5:0.5
1.3333:0.33329999999999993

Почему это так? Я ожидал, что x%1 вернет нецелую часть значения x?

1 ответ

Решение

См. Математика с плавающей точкой сломана?

Двоичная математика с плавающей запятой такая. В большинстве языков программирования он основан на стандарте IEEE 754. JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с двойным в Java. Суть проблемы заключается в том, что числа представлены в этом формате как целое число, умноженное на два; рациональные числа (например, 0,1, что составляет 1/10), знаменатель которых не является степенью двойки, не могут быть точно представлены.

Другие вопросы по тегам