У 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, то вони показують правильно. Я не впевнений, що це пов’язано з округленням? Я не встановлював жодних профілів округлення. Чи можете ви мені допомогти у вирішенні проблеми.


1
Акуратна знахідка, робить для мене те саме - ви можете просто скористатися ROUND()? =ROUND(A1,5), потім скопіювати / вставити дані як Значення та видалити початкові числа?
BruceWayne

1
@BruceWayne, що цікаво, ROUND()показує правильні цифри, але копія / вставка як значення повертає її до початкового випуску!
Rey Juna

1
@ReyJuna - Тоді просто зробіть ROUND(A1,5)знову на вставлені значення. Потім скопіюйте / вставте ці значення як значення, і Round()знову скопіюйте / вставте. ...: P ... це цікаво, і, схоже, @EugenRieck має міркування. Приємне запитання!
BruceWayne

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
@ Руслан Я бачив багато тем на арифметиці з плаваючою комою, на переповненні стека та інших веб-сайтах SE, і часто люди дають відповідь на всілякі загальні істини та уявлення про (бінарну) плаваючу точку, не стосуючись фактичних чисел і перевірка, чи поведінка відповідає IEEE. Я думаю, я міг би поставити питання "Чому 2.1 + 2.2повертається 4.80000001?" і отримаю багато відповідей, кажучи, що саме цього я повинен очікувати, коли використовую плаваючу крапку.
Джеппе Стіг Нільсен

1
@benshepherd: на екрані LibreOffice не відображається показ екрана Excel
Thomas Weller

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. Але замість цього він використовує набагато більш поширений бінарний формат подвійної точності , який має 53 біти точності, що трохи менше 16 цифр. Хоча ви можете подумати, що цього буде достатньо для числа, що містить лише 10 цифр, перетворення з десяткової в двійкову трохи ускладнює речі - тобто 2222209482 можна зберігати на 100% правильно як бінарне64 число, але 22222.09482 не може.

Майте на увазі, що типові електронні таблиці використовуються для фінансових даних, які, як правило, не вимагають стільки цифр точності, або для моделювання "що робити" в різних сценаріях, де надвисокий рівень точності не потрібен. Звичайно, є й інші інструменти (ймовірно, інші програми електронних таблиць, але я останнім часом не шукав), які за замовчуванням чи за допомогою спеціальних налаштувань конфігурації можуть використовувати більший цифровий формат, але Excel не є одним із них.

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


3
Ця відповідь була б кращою, якби вона також пояснила зауваження, що деякі цифри з десятковою ознакою відображаються точно так, як введено - наприклад, 11111.09482 в прикладі ОП.
andrew

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 показує речі заплутаним чином.
Jeppe Stig Nielsen

2
"Майте на увазі, що типові електронні таблиці використовуються для фінансових даних, які, як правило, не вимагають стільки цифр точності" - це, як правило, дуже неправильно - фінансові дані вимагають точної поведінки в сенсі "те, що ви вводите, те, що ви очікуєте, залишиться там ", Ви маєте рацію з десятковим / двійковим перетворенням тощо, але цей конкретний аргумент недійсний! Для фінансових даних ми зазвичай використовуємо певний Moneyабо BigIntegerформат, який часто використовує десятковий формат зберігання.
Honza Zidek

4
Ця відповідь недостатня для пояснення того, що відбувається. Ми спостерігаємо помилку в Excel, де номер форматований неправильно . 22222.09482 та 22222.0948199999 - це окремі двійкові64 числа.
Руслан

11

Роблячи свої обчислення, Excel повинен знайти хороше внутрішнє бінарне представлення для чисел, які він використовує. У вашому випадку він використовує номер з плаваючою комою, і фактично цей формат даних має (дуже гарне) наближення до вашого номера, але не відповідає точній відповідності. Тож якщо ви не вкажете явно Excel, який формат виводу використовувати, він зробить "найкраще зусилля", в результаті чого результат буде ближче до внутрішньо обчисленого значення, але це не зовсім текст, який ви вводите.

Просто для того, щоб зробити це зрозумілим: розуміючи, що введений текст являє собою число, а перетворення послідовності цифр у число вже відповідає визначенню "обчислення" зверху.

EDIT

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

Якщо ви використовуєте програму електронних таблиць для того, для чого вона була розроблена, і використовуєте явне форматування вихідного сигналу, щоб переконатися, що ці ефекти ніколи не перетворюються на видиму область, вам буде добре.


1
Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
DavidPostill

1
Ця відповідь недостатня для пояснення того, що відбувається. Ми спостерігаємо помилку в Excel, де номер форматований неправильно. 22222.09482 та 22222.0948199999 - це окремі двійкові64 числа.
Руслан

2

Коли я ввожу 11111.09482 та 66666.09482, 77777.09482 .. до 99999.09482, то вони показують правильно. Я не впевнений, що це пов’язано з округленням? Я не встановлював жодних профілів округлення. Чи можете ви мені допомогти у вирішенні проблеми.

Деякі числа можуть бути представлені правильно, а деякі не можуть.

Встановіть відображувану точність відповідним чином для своїх розрахунків і використовуйте функцію round () .

  • Пояснення:

  • Рішення:

    Ви можете часто не допустити, щоб помилки округлення плаваючої точки впливали на вашу роботу, встановивши опцію «Точність як відображений», перш ніж застосувати формат чисел до своїх даних. Цей параметр змушує значення кожного числа на робочому аркуші бути з точністю, яка відображається на робочому аркуші.

    1. Клацніть Файл> Параметри.
      У Excel 2007: клацніть зображення кнопки Microsoft Office кнопки Office, а потім виберіть Параметри Excel.
      Зображення кнопки

    2. Клацніть Додатково, а потім у розділі Під час розрахунку цієї робочої книги встановіть прапорець Встановити точність як відображено та натисніть кнопку ОК.

    3. Натисніть кнопку ОК.

    4. На робочому аркуші виберіть комірки, які ви хочете відформатувати.

    5. На вкладці Домашня сторінка натисніть зображення кнопки запуску діалогового вікна поруч із номером.
      Зображення кнопки запуску
      Зображення стрічки Excel

    6. У полі Категорія натисніть Номер.

    7. У полі Десяткові місця введіть кількість десяткових знаків, які ви хочете відобразити.

    Порада: Щоб мінімізувати будь-які наслідки неточності зберігання арифметичних знаків з плаваючою комою, ви також можете використовувати функцію ROUND для округлення чисел до числа десяткових знаків, необхідних для вашого обчислення.

  • Журнал бухгалтерського обліку - " Помилка обчислення помилок Excel ":

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

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

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

    2. Точність. Ви можете ввімкнути опцію Precel як відображене Excel, щоб змусити всі формули скорочувати і округляти обчислені значення на основі видимих ​​цифр.

    Щоб увімкнути цю опцію в Excel 2013, 2010 та 2007, виберіть «Файл» («Офіс»), «Опції» (або Параметри Excel), «Додатково», а в розділі «Розрахунок цієї робочої книги» встановіть прапорець Встановити точність як відображене і потім натисніть кнопку ОК.

    У програмах Excel 2003, 2002 та 2000 у меню «Інструменти» виберіть Опції та на вкладці «Розрахунок» у розділі Параметри робочої книги встановіть прапорець «Точність як показаний» та натисніть «ОК».


1
Пояснення не має значення: різниця між очікуваними та отриманими числами становить 28 ULP - це занадто багато для природної помилки округлення. «Рішення» просто приховує справжню помилку.
Руслан

Було б чудово, якби ви могли опублікувати це разом із кількома посиланнями, що підтримують вашу відповідь, як власну відповідь замість коментаря. Таким чином, він потрапить до відома користувача954171, і люди зможуть проголосувати за нього. Чи можете ви надати посилання на звіт про помилку?
Роб

Тут вже є відповідь з усіма відповідними математичними подробицями. Не знаю, про будь-яку помилку повідомляє про це.
Руслан

0

Як я впевнений, ви знаєте, що комп'ютери внутрішньо працюють лише за допомогою нулів та одиниць (ака-бітів) і мають фіксовану кількість біт, щоб представляти значення (зазвичай це 64 біти на сьогодні). Це означає, що кількість різних значень, які можна представити, становить від 2 до 64-ї потужності. Це, звичайно, величезна кількість, але кількість можливих значень є кінцевою, тому не всі числа можуть бути представлені. Коли він зустрічає число, яке не може точно представляти, воно автоматично замінюється на найближче, яке воно може представляти. Це те, що ти бачиш.


Ви заявляєте, що це через перетворення бази чи через обмежену кількість пам'яті на значення? В обох випадках ваше міркування неправильне. Технічно цілком можливо мати довільну точність і довільні числа довжини - припускаючи нескінченну пам'ять. Для прикладу, є GNU bignum. Крім того, немає необхідної кодування чисел у форматі втрат. Тому не винна ні інформатика, ні двійкові числа. Лише розробники Excel обрали кодування номерів, яке є втратою wrt користувача.
фреснель

-1

Комп'ютери виконують математику у двійковій формі і майже завжди використовують плаваючу крапку для не цілих значень. Єдиними дробовими значеннями, які можна точно представити у плаваючій точці, має бути сума деякої комбінації дробових потужностей 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...), що закінчується при встановленому межі точності (зазвичай 53 біта). Ці значення не завжди мають чітке або точне подання у десятковій формі, і навпаки, не всі дробові значення, які ви можете точно представити у десятковій формі, матимуть точне подання у двійковій формі. Наприклад: 0,1. Вона не може бути представлена ​​як сума дробових потужностей 2, яка не триває вічно.

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

Чому 53 біта (дають чи беруть)? Оскільки типовий стандарт для зберігання плаваючої точки з подвійною точністю використовує 64 біти, в яких є мантіса (також її називають significand), знаковий індикатор та показник. Експоненту зазвичай виділяється 10 біт, знак бере один, залишаючи 53 для мантіси. Це для зберігання. Розрахунки, як правило, проводяться за допомогою 80 біт і закруглені назад.

Бувають ситуації, коли комп'ютери працюватимуть в базі 10, особливо при роботі з грошовими значеннями, коли округлення артефактів неприйнятне.


2
Я не погоджуюся з твердженням про ковдру про всі комп'ютери . Було багато комп'ютерів, правда, більшість з них вже не активно використовується, окрім музейних предметів, які використовували десятичні цифрові формати для зберігання та обчислення. Існує також BCD - Binary Coded Decimal - використовується в багатьох останніх процесорах, включаючи обмежене використання в процесорах Intel. Ніщо з цього не має значення для розглянутого питання - методу, який використовує Microsoft Excel для зберігання номерів, який є всім двійковим. Але "Усі комп'ютери" невірно.
manassehkatz-Reinstate Моніка

Я бачу перехід від "Усі комп'ютери" до "Комп'ютери" - я б перейшов із "Майже на всі комп'ютери" чи "Більшість сучасних комп'ютерів" чи щось подібне. Я знаю - я прискіплива. Але так є і комп’ютери :-)
manassehkatz-Reinstate Моніка

@manassehkatz Усі цифрові комп'ютери в основному є бінарними. BCD - це лише основа-10 на вершині двійкової структури для полегшення арифметики десятків.
Zenilogix

Незважаючи на те, що всі цифрові комп’ютери є принципово двійковими, їх на початку було досить багато, які базувалися на десятковій основі. Але я згоден, що BCD є по суті базовою структурою на вершині двійкової, щоб полегшити десяткову арифметику.
manassehkatz-Reinstate Моніка

Ця відповідь звучить так, ніби це вина комп'ютера. Але це не так. Ви можете представити будь-яке число, яке ви могли записати на папері (представляти 1/3 точно? Легко при зберіганні у вигляді дробу, наприклад). Це дійсно про те, яке представлення автори Excel обрали для представлення чисел.
френель

-1

Як і багато хто з вище сказаних, це внутрішня помилка представлення. Excel зробив вибір для подвійної точності, 64-бітових чисел з плаваючою точкою. Це дає 2 64 можливих значення. Домен реальних чисел містить нескінченність значень, тому при спробі використовувати те, яке не може бути представлене Excel, воно буде використовувати найближче, що може бути представлене.

Я бачив коментарі, які говорять про те, що з урахуванням нескінченної пам’яті будь-яке реальне число може бути представлене. Щоправда, але немає такого поняття, як "нескінченна пам'ять", тому це суперечка. Інші заявили, що Excel міг би використовувати більше внутрішнє представлення, наприклад, 128 біт. Щоправда, але виявляється, що комп'ютери краще робити математичні операції на числах, представлених числом біт, що відповідає розміру шини процесора. Таким чином, 32-розрядний комп'ютер буде найшвидшим при математичних операціях на 32-бітових числах, а 64-розрядний комп'ютер буде найшвидшим при математичних операціях на 64-бітних числах. Якщо і коли з'явиться 128-бітний комп'ютер, тоді ми можемо очікувати, що Excel перейде до 128-бітного представлення чисел. Це все ще забезпечить дуже великий, але обмежений набір цифр, який можна представити.

Якщо ви турбуєтесь про те, як виглядають цифри в електронній таблиці, то за допомогою заданої точності (кількості десяткових знаків) ви отримаєте стійкі результати. Якщо ви турбуєтесь про різницю між номером, який ви вводите, та фактичним числом, що зберігається в Excel, ви маєте рацію. Різниця справжня, і помилка буде здійснена через будь-які зроблені вами розрахунки. Я боюся, що ви застрягли в цій помилці. Це обмеження Excel, а не помилка, як дехто заявив. Це, швидше за все, незабаром не зміниться, тому, якщо для вас це не прийнятно, я пропоную вам пошукати інше додаток для електронних таблиць, яке може представляти числа з більшою точністю. Але майте на увазі, що якщо ви знайдете будь-яке подібне застосування, обмеження все ж є. Просто розмір помилки відрізняється.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.