Смешные (округления?) Ошибки при добавлении

В одном столбце есть числа (всегда с двумя десятичными знаками, некоторые вычисляются, но все умножения и деления округляются до 2 десятичных знаков), а другой - кумулятивный. Накопительная колонка имеет формулу =<above cell>+<left cell>,

В накопительном столбце результат равен 58,78, следующий номер в первом столбце равен -58,78. Из-за различного форматирования для нуля, чем для положительных или отрицательных чисел, я заметил, что что-то не так. Если изменить формат на несколько десятичных знаков, числа будут выглядеть следующим образом:

                                    £58.780000000000000000000000000000
-£58.780000000000000000000000000000  £0.000000000000007105427357601000

Ненулевой ноль составляет около 2^(-47). В другой раз цифры в такой же ситуации:

                                    £50.520000000000000000000000000000
-£50.520000000000000000000000000000 -£0.000000000000007105427357601000

Как это может случиться?

Кроме того, если я изменю ячейку в накопительном столбце на фактическое число 58,78, результат внезапно станет равным нулю.

1 ответ

Google Sheets использует арифметику с плавающей запятой двойной точности, которая создает такие артефакты. Относительная точность этого формата составляет 2^(-53), поэтому для числа размером около 2^6 = 64 мы ожидаем ошибку усечения 2^(-47).

Некоторые пользователи электронных таблиц будут обеспокоены, если узнают, что "58,78" на самом деле не 58,78, потому что это число не допускает точного представления в этом формате с плавающей запятой. Таким образом, электронная таблица скрывает правду, округляя число для отображения и печатая фальшивые нули при запросе дополнительных цифр. Те нули после 58,78 являются поддельными.

Истина обнаруживается, когда вычитаете два числа, которые кажутся идентичными, но не являются - потому что они были вычислены по-разному, например, одно получено как сумма, а другое - прямым вводом. Округление результата вычитания до нуля было бы слишком большой ложью: это больше не вопрос небольшой относительной ошибки, разница между 2^(-47) и 0 может быть важной. Отсюда неожиданное раскрытие механики за кадром.

См. Также: Почему в Google Spreadsheets написано, что ноль не равен нулю?

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