Почему в Google Spreadsheets написано, что ноль не равен нулю?


8

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

Пока это приводит к нулю

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))

сравнение с нулем дает мне ложь

=((0,6-0,3-0,4)+(-0,3+0,8-0,4))=0

Какого черта я пропускаю?


2
Вы никогда не сталкивались с радостями математики с плавающей точкой?
Але

1
Да, я сделал (в худшем случае) с Javascript. Но разве математические вычисления Google Spreeadsheets не происходят на стороне сервера?
Бруно

Вероятно. Боюсь, у меня нет ответа для вас. Просто мне показалось немного смешным, что вот еще один домен, где 0 != 0.
Але

1
Возможно, вы могли бы проверить, меньше или равно наименьшее число.
aparente001

«Потратив часы на то, чтобы выяснить ошибку в моей личной бухгалтерской таблице» - очень нравится это: D рад, что я не единственный человек, который тратит время таким образом;)
Строка

Ответы:


6

Благодаря чудесам арифметики с плавающей точкой ,

((0.6-0.3-0.4)+(-0.3+0.8-0.4))

оценивается примерно в -5,55e-17 с двойной точностью. Это относится как к JavaScript, так и к таблицам Google. На самом деле не имеет значения, являются ли вычисления на стороне клиента или на стороне сервера: важен используемый числовой формат. Похоже, что Google Sheets использует двойную точность .

Решение одно и то же: избегайте сравнения равенства для чисел с плавающей запятой. В вашем случае, изменение единиц путем умножения всего на 10 позволит избежать проблемы.


1
Я упомянул "серверную часть", потому что Google мог использовать десятичный числовой тип произвольной точности из своего любимого языка программирования на своих серверах.
Бруно

Существует платформа, которая использует десятичную, а не двоичную с плавающей запятой: HP48S. Я выяснил, что действительные десятичные цифры хранятся в пачках по 4 бита, поэтому они расточительны, поскольку используются не все комбинации из 4 бит. Я помню, что я экспериментировал, напрямую меняя память и даже делая цифры больше 9.
Хеймдалль

Мое решение было =FLOOR(B3+C2, 0.01)для работы с валютой
NonlinearFruit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.