В Excel, когда я ввожу 22222.09482, я вижу число 22222.0948199999 в строке формул

28

Не могли бы вы помочь - у меня странная ситуация, когда я ввожу в ячейку число 22222.09482, тогда в строке формул я вижу другое число 22222.0948199999. Ниже приведен снимок проблемы.

Ошибка образца

Я вижу то же самое поведение, когда я ввожу следующие числа:

22222.09482
33333.09482
44444.09482
55555.09482

но когда я ввожу 11111.09482 и 66666.09482, 77777.09482 .. до 99999.09482, тогда они отображаются правильно. Я не уверен, что это связано с округлением? Я не настроил никаких профилей округления. Не могли бы вы помочь мне в решении проблемы.

user954171
источник
1
Аккуратная находка, делает то же самое для меня - вы можете просто использовать ROUND()? =ROUND(A1,5), а затем скопировать / вставить данные как значения и удалить исходные числа?
Брюс Уэйн,
1
@BruceWayne, интересно, что ROUND()показывает правильные цифры, но копирование / вставка в качестве значения возвращает его к исходной проблеме!
Рей Джуна
1
@ReyJuna - Тогда просто сделайте еще ROUND(A1,5)раз на вставленные значения. Затем скопируйте / вставьте их как значения и Round()снова, затем скопируйте / вставьте. ...: P ... это интересно, и, похоже, у @EugenRieck есть причины. Хороший вопрос!
Брюс Уэйн,
1
Вы действительно заботитесь о разнице между 22222.09482 и 22222.0948199999? Разница в 5 частей в 100 трлн.
Рассел Борогове
4
Математика с плавающей точкой нарушена? , Однако это, скорее всего, ошибка, так как doubleимеет достаточную точность, чтобы при округлении отображать правильные значения, как и ожидало большинство людей
phuclv

Ответы:

31

Это ошибка.

В соответствии с другими ответами Excel использует обычное представление двойной точности IEEE. Его точность составляет 53 значащих двоичных разряда, что соответствует примерно 16 десятичным разрядам.

Всегда безопасно отображать первые 15 значащих десятичных цифр. В том смысле, что любое десятичное «представленное» число, заданное 15 цифрами, можно безопасно отличить от чисел, полученных путем изменения 15-го десятичного знака на единицу. Например, 15-значные числа:

22222.09481 99999
22222.09482 00000
22222.09482 00001

сопоставить с тремя различными числами двойной точности. Ни один из этих трех не будет «соседями» в представлении двойной точности, в данном конкретном случае.

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

Фактически, в этой области (между 16384 и 32768) абсолютная точность составляет 2 -38 , и представляются следующие числа:

...
22222.09481 99998 96571 9714760780334472656250000
22222.09481 99999 00209 9502831697463989257812500 <-- the one closest to what Excel showed to the user
22222.09481 99999 03847 9290902614593505859375000
22222.09481 99999 07485 9078973531723022460937500
22222.09481 99999 11123 8867044448852539062500000
22222.09481 99999 14761 8655115365982055664062500
22222.09481 99999 18399 8443186283111572265625000
22222.09481 99999 22037 8231257200241088867187500
22222.09481 99999 25675 8019328117370605468750000
22222.09481 99999 29313 7807399034500122070312500
22222.09481 99999 32951 7595469951629638671875000
22222.09481 99999 36589 7383540868759155273437500
22222.09481 99999 40227 7171611785888671875000000
22222.09481 99999 43865 6959682703018188476562500
22222.09481 99999 47503 6747753620147705078125000
22222.09481 99999 51141 6535824537277221679687500
22222.09481 99999 54779 6323895454406738281250000
22222.09481 99999 58417 6111966371536254882812500
22222.09481 99999 62055 5900037288665771484375000
22222.09481 99999 65693 5688108205795288085937500
22222.09481 99999 69331 5476179122924804687500000
22222.09481 99999 72969 5264250040054321289062500
22222.09481 99999 76607 5052320957183837890625000
22222.09481 99999 80245 4840391874313354492187500
22222.09481 99999 83883 4628462791442871093750000
22222.09481 99999 87521 4416533708572387695312500
22222.09481 99999 91159 4204604625701904296875000
22222.09481 99999 94797 3992675542831420898437500
22222.09481 99999 98435 3780746459960937500000000 <-- the one closest to what the user types
22222.09482 00000 02073 3568817377090454101562500
22222.09482 00000 05711 3356888294219970703125000
22222.09482 00000 09349 3144959211349487304687500
22222.09482 00000 12987 2933030128479003906250000
22222.09482 00000 16625 2721101045608520507812500
22222.09482 00000 20263 2509171962738037109375000
22222.09482 00000 23901 2297242879867553710937500
22222.09482 00000 27539 2085313796997070312500000
22222.09482 00000 31177 1873384714126586914062500
22222.09482 00000 34815 1661455631256103515625000
22222.09482 00000 38453 1449526548385620117187500
22222.09482 00000 42091 1237597465515136718750000
22222.09482 00000 45729 1025668382644653320312500
22222.09482 00000 49367 0813739299774169921875000
22222.09482 00000 53005 0601810216903686523437500
22222.09482 00000 56643 0389881134033203125000000
22222.09482 00000 60281 0177952051162719726562500
22222.09482 00000 63918 9966022968292236328125000
22222.09482 00000 67556 9754093885421752929687500
22222.09482 00000 71194 9542164802551269531250000
22222.09482 00000 74832 9330235719680786132812500
22222.09482 00000 78470 9118306636810302734375000
22222.09482 00000 82108 8906377553939819335937500
22222.09482 00000 85746 8694448471069335937500000
22222.09482 00000 89384 8482519388198852539062500
22222.09482 00000 93022 8270590305328369140625000
22222.09482 00000 96660 8058661222457885742187500
22222.09482 00001 00298 7846732139587402343750000
...

Чтобы уточнить дальше, попробуйте набрать 22222.09482в одной ячейке и набрать 22222.0948199999(пять конечных девяток) в другой ячейке. Excel должен выбрать двух представителей IEEE, указанных стрелкой выше. И я думаю, что это так, потому что вы можете рассчитать разницу этих двух ячеек, чтобы получить 9.82254E-11. Но оба показаны одинаково.

Если бы Excel показал первые 17 цифр, было бы полезно точно определить, какой номер IEEE находится «под» десятичным числом. В таком случае:

22222.0948199999 --> 22222.09481 99999 00
22222.09482      --> 22222.09481 99999 98

Но показ 15 цифр, округленных неправильно, вводит в заблуждение и бесполезен.


Прежде чем кто-либо заявляет, что это намеренно, то почему 8.7не проявляется такое же поведение? Ближайшее число двойной точности к 8.7:

8.69999999999999 93

таким образом, это должно показать, как 8.69999999999999будто это было преднамеренно. Но это не так.

Джепп Стиг Нильсен
источник
9
Вы правы, это ошибка. Алгоритмы преобразования двоичного числа с плавающей запятой, отображающего наименьшее количество значащих цифр, сложны, но известны. Похоже, кто-то упустил некоторые важные детали.
Марк Рэнсом
2
@Ruslan Я видел много потоков по арифметике с плавающей запятой, по переполнению стека и другим сайтам SE, и часто люди дают ответы со всеми видами общих истин и понятий о (двоичной) переменной с плавающей запятой, без связи с фактическими числами и проверка, соответствует ли поведение IEEE. Я думаю, что я мог бы опубликовать вопрос "Почему 2.1 + 2.2возвращается 4.80000001?" и получить много ответов о том, что это то, что я должен ожидать, когда я использую с плавающей запятой.
Джеппе Стиг Нильсен
1
@benshepherd: снимок экрана LibreOffice не показывает то, что показывает снимок экрана Excel
Томас Уэллер
1
@JeppeStigNielsen: 2,1 + 2,2 = 4,8? Это всего лишь 0,5 от. Это нормально.
Томас Веллер
@MarkRansom: так, Excel действительно реализует это сам? Excel не реализован в C ++ или что-то такое, что делает для этого вычисление с плавающей запятой? Это то, что вы говорите? Или это ошибка в C ++, которая затрагивает миллионы приложений?
Томас Веллер
22

Excel хранит числа в двоичном 64-битном формате IEEE 754 с плавающей запятой. Ключ «хранит» - изменение с десятичного на двоичное происходит при каждом сохранении числа, а не только при его использовании в реальных вычислениях.

Хорошая статья на эту тему - « Понимание точности с плавающей запятой», или «Почему Excel дает мне, казалось бы, неправильные ответы?»

Можно создать программу для работы с электронными таблицами, которая будет обрабатывать действительно большие числа с большим количеством значащих цифр. Но это не очень практично. В Excel можно было бы использовать формат IEEE 754 decimal128 , который допускает 34 десятичных знака - более чем достаточно для хранения 22222.09482. Но вместо этого он использует гораздо более распространенный двоичный формат Double Precision64 , который имеет точность 53 бита, что составляет чуть менее 16 цифр. Хотя вы можете подумать, что этого будет достаточно для числа, содержащего только 10 цифр, преобразование из десятичного в двоичное несколько усложняет ситуацию, т. Е. 2222209482 может храниться на 100% правильно как двоичное число 64, а 22222.09482 - нет.

Имейте в виду, что электронные таблицы обычно используются для финансовых данных, которые обычно не требуют большого количества цифр точности, или для моделирования «что если» в различных сценариях, где не требуется сверхвысокий уровень точности. Конечно, есть и другие инструменты (и, возможно, другие программы для работы с электронными таблицами, но я в последнее время не искал), которые по умолчанию или с помощью специальных настроек конфигурации могут использовать больший числовой формат, но Excel не является одним из них.

Для тех, кто отмечает, что LibreOffice справляется с этим лучше, внешность может быть обманчива. Смотрите этот пост для более подробной информации. Кажется, что LibreOffice обрабатывает большие числа немного по-разному, но имеет одинаковое базовое 64-битное представление с плавающей точкой с похожими проблемами.

Манассехкац-Восстановить Монику
источник
3
Этот ответ был бы лучше, если бы он также объяснил наблюдение, что некоторые числа с десятичными знаками отображаются точно так же, как и введенные - например, 11111.09482 в примере ОП.
Андрей
11
Просто для удовольствия: 22222.09482хранится как 1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)в IEEE 754, или, другими словами, точно так 1.35632902954101553 * 2^14, как есть 22222.0948199999984353787904.
YoYoYonnY
1
Binary64 (он же двойная точность) является более чем достаточно для ряда с десятью десятичными цифрами. Конечно, это не может быть представлено точно, но большинство чисел, включая 0.2и 0.1не может быть представлено точно (фракция 1/5 (одна пятая) имеет бесконечное повторяющееся двоичное расширение). Тем не менее, Excel показывает вещи в замешательстве.
Джеппе Стиг Нильсен
2
«Имейте в виду, что обычно электронные таблицы используются для финансовых данных, которые обычно не требуют стольких цифр точности» - это, как правило, очень неправильно - финансовые данные требуют точного поведения в том смысле, что «то, что вы напечатаете, это то, что вы ожидаете, останется там». Msgstr "Вы правы с десятичным / двоичным преобразованием и т. Д., Но этот конкретный аргумент недействителен! Для финансовых данных мы обычно используем какой-то Moneyили BigIntegerформат, который часто использует десятичный формат хранения.
Хонза Зидек
4
Этого ответа недостаточно, чтобы объяснить, что происходит. Мы наблюдаем ошибку в Excel, где число неправильно отформатировано . 22222.09482 и 22222.0948199999 являются различными двоичными числами.
Руслан
11

При выполнении вычислений Excel должен найти хорошее внутреннее двоичное представление для используемых чисел. В вашем случае он использует число с плавающей запятой, и фактически этот формат данных имеет (очень хорошее) приближение для вашего числа, но не дает точного соответствия. Поэтому, если вы явно не укажете Excel, какой выходной формат использовать, он приложит «все усилия», что приведет к выводу, который ближе к внутренне вычисляемому значению, но не совсем к вводимому вами тексту.

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

РЕДАКТИРОВАТЬ

Я не совсем ясно дал понять, что считаю выбор использования 64-битного представления с плавающей точкой действительно хорошим: Excel не является инструментом для ученых, где ошибка округления в 11-й цифре после десятичной запятой составляет большое влияние, но бухгалтеры не хотят, чтобы их скорость обработки, уменьшенная в миллионы раз, стала источником неточных вычислений, которые могут проявиться в числах, которые они никогда не используют.

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

Евгений Рик
источник
1
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
DavidPostill
1
Этого ответа недостаточно, чтобы объяснить, что происходит. Мы наблюдаем ошибку в Excel, где число неправильно отформатировано. 22222.09482 и 22222.0948199999 являются различными двоичными числами.
Руслан
2

Когда я ввожу 11111.09482 и 66666.09482, 77777.09482 .. до 99999.09482, тогда они отображаются правильно. Я не уверен, что это связано с округлением? Я не настроил никаких профилей округления. Не могли бы вы помочь мне в решении проблемы.

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

Установите отображаемую точность в соответствии с вашими расчетами и используйте функцию round () .

  • Объяснение:

  • Решение:

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

    1. Нажмите Файл> Параметры.
      В Excel 2007: щелкните значок кнопки «Office» в Microsoft Office, а затем выберите «Параметры Excel».
      Изображение кнопки

    2. Нажмите кнопку «Дополнительно», а затем в разделе «При вычислении этой книги» установите флажок «Задать точность как отображается» и нажмите кнопку «ОК».

    3. Нажмите ОК.

    4. На листе выберите ячейки, которые вы хотите отформатировать.

    5. На вкладке Главная щелкните изображение кнопки запуска диалогового окна рядом с номером.
      Изображение кнопки запуска
      Изображение ленты Excel

    6. В поле «Категория» нажмите «Число».

    7. В поле «Десятичные знаки» введите количество десятичных знаков, которое вы хотите отобразить.

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

  • Журнал бухгалтерии - « Ошибка в расчетах Excel »:

    Некоторые нечетные числа создают повторяющиеся двоичные десятичные дроби, и когда эти повторяющиеся цифры обрезаются после 15 разрядов, двоичное число не преобразуется обратно точно в предполагаемое числовое значение. Например, во всех выпусках Excel формула 22.26 - 21.29 должна давать 0,97, но вместо этого дает 0,970000000000002. Попробуйте, и не забудьте увеличить ширину столбца и десятичные разряды, чтобы вы могли увидеть проблему вычисления.

    Такие ошибки обычно считаются незначительными или несущественными, поскольку они редко проявляются в значимых ошибках в расчетах; тем не менее, вот две меры, которые вы можете предпринять, чтобы устранить потенциальные ошибки с плавающей запятой:

    1. Круглая функция. Используйте функцию ROUND в Excel, чтобы округлить вычисленные значения до нужного десятичного знака, тем самым исключив любую возможность появления 15-значных аномалий. Например, формула = ROUND (-21,29 + 22,26,2) точно дает 0,97.

    2. Точность. Можно включить параметр «Точность как отображаемый» в Excel, чтобы все формулы усекались и округляли вычисленные значения на основе видимых цифр.

    Чтобы включить этот параметр в Excel 2013, 2010 и 2007, выберите «Файл» (или «Сфера Office»), «Параметры» (или «Параметры Excel»), «Дополнительно» и в разделе «При вычислении этой книги» установите флажок «Задать точность как отображаемый» и затем нажмите ОК.

    В Excel 2003, 2002 и 2000 в меню «Сервис» выберите «Параметры» и на вкладке «Расчет» в разделе «Параметры рабочей книги» установите флажок «Точность как отображается» и нажмите кнопку «ОК».

обкрадывать
источник
1
Объяснение не имеет значения: разница между ожидаемыми и полученными числами составляет 28 ULP - слишком много для естественной ошибки округления. «Решение» просто скрывает реальную ошибку.
Руслан
Было бы здорово, если бы вы могли опубликовать это вместе с несколькими ссылками, поддерживающими ваш ответ, как ваш собственный ответ вместо комментария. Таким образом, это привлечет внимание пользователя 954171, и люди смогут проголосовать за него. Можете ли вы предоставить ссылку на сообщение об ошибке?
Роб
Там уже есть ответ со всеми соответствующими математическими деталями. Не знаю ни одного сообщения об ошибке об этом, хотя.
Руслан
0

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

Хавьер Альварадо
источник
Вы утверждаете, что это из-за преобразования чисел или из-за ограниченного объема памяти на одно значение? В обоих случаях ваши рассуждения неверны. Технически вполне возможно иметь произвольную точность и числа произвольной длины - при условии бесконечной памяти. Чтобы привести пример, есть GNU bignum. Кроме того, нет необходимости кодировать числа в формате с потерями. Так что ни компьютерная наука не виновата, ни двоичные числа. Только разработчики Excel выбрали числовую кодировку с потерями при вводе пользователем.
Френель
-1

Компьютеры выполняют свою математику в двоичном формате и почти всегда используют числа с плавающей запятой для нецелых значений. Единственные дробные значения, которые могут быть точно представлены в плавающей запятой, должны быть суммой некоторой комбинации дробных степеней 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...), заканчивающихся с заданным пределом точности (обычно 53 бита). Эти значения не всегда имеют аккуратное или точное представление в десятичном формате, и, наоборот, не все дробные значения, которые вы можете представить точно в десятичном виде, будут иметь точное представление в двоичном виде. Например: 0,1. Это не может быть представлено как сумма дробных степеней 2, которая не продолжается вечно.

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

Почему 53 бита (дать или взять)? Потому что типичный стандарт для хранения «двойной точности» с плавающей запятой использует 64 бита, в которых есть мантисса (также называемая значением), индикатор знака и показатель степени. Экспоненту обычно выделяется 10 битов, знак занимает один, оставляя 53 для мантиссы. Это для хранения. Расчеты обычно выполняются с использованием 80 бит и округляются назад.

Существуют ситуации, когда компьютеры будут работать на базе 10, особенно при работе с денежными значениями, когда артефакты округления неприемлемы.

Zenilogix
источник
2
Я не согласен с одеялом Все компьютеры заявление. Было много компьютеров, которые, по общему признанию, больше не использовались активно, за исключением музейных экспонатов, которые использовали десятичные числовые форматы для хранения и расчетов. Существует также BCD - двоичное кодированное десятичное число - используется в ряде более поздних процессоров, включая ограниченное использование в процессорах Intel. Ничто из этого не имеет отношения к рассматриваемому вопросу - метод, используемый Microsoft Excel для хранения чисел, который является двоичным. Но «Все компьютеры» не правильно.
Manassehkatz-Восстановить Монику
Я вижу изменение «Все компьютеры» на «Компьютеры» - я бы выбрал «Почти все компьютеры» или «Самые современные компьютеры» или что-то в этом роде. Я знаю - я придирчив. Но как и компьютеры :-)
manassehkatz-Reinstate Monica
@manassehkatz Все цифровые компьютеры являются двоичными. BCD - это просто структура base-10 поверх двоичной системы для упрощения десятичной арифметики.
Zenilogix
Хотя все цифровые компьютеры являются в основном двоичными, в первые дни их было довольно много, которые основывались на десятичной системе счисления. Но я согласен с тем, что BCD - это, по сути, структура с основанием 10 поверх двоичной системы для упрощения десятичной арифметики.
manassehkatz-Восстановить Монику
Этот ответ звучит так, как будто это ошибка компьютера. Но это не так. Вы можете точно представить любое число, которое вы можете написать на бумаге (например, 1/3 - это легко, например, при хранении в виде дроби). Это действительно о том, какое представление авторы Excel выбрали для представления чисел.
Френель
-1

Как уже говорили многие, это внутренняя ошибка представления. Excel сделал выбор для 64-битных чисел с плавающей запятой двойной точности. Это дает вам 2 64 возможных значения. Домен действительных чисел содержит бесконечность значений, поэтому, когда вы пытаетесь использовать тот, который не может быть представлен в Excel, он будет использовать наиболее близкие, которые могут быть представлены.

Я видел комментарии о том, что, учитывая бесконечную память, можно представить любое действительное число. Правда, но не существует такой вещи, как «бесконечная память», так что это спорный вопрос. Другие заявили, что Excel мог бы использовать большее внутреннее представление, например 128 бит. Правда, но оказывается, что компьютеры лучше выполняют математические операции над числами, представленными с количеством битов, которое соответствует размеру шины процессора. Таким образом, 32-разрядный компьютер будет быстрее всех в математических операциях с 32-разрядными числами, а 64-разрядный компьютер будет быстрее всех в математических операциях с 64-разрядными числами. Если и когда будет 128-битный компьютер, то мы можем ожидать, что Excel перейдет на 128-битное представление чисел. Это все еще обеспечит очень большой, но ограниченный набор чисел, которые могут быть представлены.

Если вас беспокоит то, как числа выглядят в электронной таблице, то использование заданной точности (числа десятичных знаков) даст вам согласованные результаты. Если вы беспокоитесь о разнице между введенным вами номером и фактическим номером, сохраненным в Excel, вы вправе быть обеспокоенным. Разница реальна, и ошибка будет отражена во всех ваших расчетах. Я боюсь, что вы застряли с этой ошибкой. Это ограничение Excel, а не ошибка, как утверждают некоторые. В ближайшее время он вряд ли изменится, поэтому, если он для вас неприемлем, я предлагаю вам найти другое приложение для работы с электронными таблицами, которое может представлять числа с более высокой точностью. Но имейте в виду, что если вы найдете какое-либо такое приложение, ограничение все еще существует. Это просто размер ошибки, который отличается.

Тиби
источник