Почему 4,1% 2 возвращает 0,0999999999999996 с использованием Ruby, но 4,2% 2 == 0,2 - PullRequest
5 голосов
/ 09 января 2012

Почему 4,1% 2 возвращает 0,0999999999999996? Но 4,2% 2 == 0,2.

Ответы [ 5 ]

5 голосов
/ 09 января 2012

См. Здесь: Что должен знать каждый программист об арифметике с плавающей точкой

Действительные числа бесконечны.Компьютеры работают с конечным числом битов (сегодня 32 бита, 64 бита).В результате компьютерная арифметика с плавающей точкой не может представлять все действительные числа.0.1 является одним из этих чисел.

Обратите внимание, что проблема связана не с Ruby, а со всеми языками программирования, потому что это происходит из того, как компьютеры представляют реальные числа.

1 голос
/ 09 января 2012

с двойной точностью, 4.1 = 4.0999999999999996447286321199499070644378662109375 и 4.2 = 4.20000000000000017763568394002504646778106689453125. Другими словами, двоичное приближение к десятичному 4.1 немного меньше, чем вы ожидаете, а двоичное приближение к десятичному 4.2 немного больше.

Теперь, почему 0.20000000000000017 ... округлили до 0,2, а 0,099999999999999644 ... НЕ округлили до 0,1? Ruby, вероятно, округляет все выходные данные до 15 значащих десятичных цифр.

1 голос
/ 09 января 2012

Вот другая страница с плавающей точкой: http://docs.python.org/tutorial/floatingpoint.html. Это из документов Python, но это верно для всех языков, которые используют двоичные числа с фиксированным размером.

1 голос
/ 09 января 2012

Float s не всегда могут быть представлены точно, см.

Что должен знать каждый программист об арифметике с плавающей точкой

0 голосов
/ 09 января 2012

Потому что вы работаете с плавающей точкой.Двоичная с плавающей точкой не может точно представлять 0,1.

...