W programie Excel, gdy wpisuję 22222.09482, wtedy widzę liczbę 22222.0948199999 na pasku formuły

28

Czy mógłbyś mi pomóc - ponieważ mam dziwną sytuację, gdy po wpisaniu liczby 22222.09482 w komórce widzę inną liczbę 22222.0948199999 na pasku formuły. Poniżej znajduje się migawka problemu.

Przykładowy błąd

Widzę to samo, gdy wprowadzam następujące liczby:

22222.09482
33333.09482
44444.09482
55555.09482

ale kiedy wprowadzę 11111.09482 i 66666.09482, 77777.09482 .. do 99999.09482, to pokażą się poprawnie. Nie jestem pewien, czy jest to związane z zaokrąglaniem? Nie ustawiłem żadnych profili zaokrąglania. Czy możesz mi pomóc w rozwiązaniu problemu.

użytkownik954171
źródło
1
Czyste znalezisko, czy to samo dla mnie - możesz po prostu użyć ROUND()? =ROUND(A1,5), a następnie skopiować / wkleić dane jako Wartości i usunąć oryginalne liczby?
BruceWayne,
1
@BruceWayne, co ciekawe, ROUND()pokazuje poprawne cyfry, ale wartość kopiuj / wklej jako przywraca pierwotny numer!
Rey Juna,
1
@ReyJuna - Następnie wykonaj ROUND(A1,5)ponownie wklejone wartości. Następnie skopiuj / wklej je jako wartości, a Round()następnie ponownie skopiuj / wklej. ...: P ... to interesujące i wygląda na to, że @EugenRieck ma uzasadnienie. Fajne pytanie!
BruceWayne,
1
Czy naprawdę interesuje Cię różnica między 22222.09482 a 22222.0948199999? To różnica 5 części na 100 trylionów.
Russell Borogove
4
Czy matematyka zmiennoprzecinkowa jest zepsuta? . Jest to jednak prawdopodobnie błąd, ponieważ doublema wystarczającą precyzję, że po zaokrągleniu pokazuje prawidłowe wartości, jakich oczekuje większość ludzi
phuclv

Odpowiedzi:

31

To jest błąd.

Excel używa zwykłej reprezentacji podwójnej precyzji IEEE, zgodnie z innymi odpowiedziami. Jego precyzja wynosi 53 znaczące cyfry binarne, co odpowiada mniej więcej 16 cyfrom dziesiętnym.

Wyświetlenie pierwszych 15 cyfr po przecinku jest zawsze „bezpieczne” . W tym sensie, że każdą „przedstawioną” liczbę dziesiętną podaną 15 cyframi można bezpiecznie odróżnić od liczb uzyskanych przez zmianę 15. cyfry dziesiętnej na jedną. Na przykład 15-cyfrowe liczby:

22222.09481 99999
22222.09482 00000
22222.09482 00001

odwzorować na trzy odrębne liczby podwójnej precyzji. Żadne z tych trzech nie będzie „sąsiadami” w reprezentacji podwójnej precyzji, w tym konkretnym przypadku.

Tak więc mylące dwa pierwsze na ekranie użytkownika jest błędem programu Excel.

W rzeczywistości w tej dziedzinie (między 16384 a 32768) absolutna precyzja wynosi 2–38 , a następujące liczby są reprezentatywne:

...
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
...

Aby rozwinąć tę kwestię, spróbuj wpisać 22222.09482jedną komórkę, a 22222.0948199999drugą (pięć końcowych dziewiątek) w innej komórce. Excel powinien wybrać dwóch przedstawicieli IEEE wskazanych strzałką powyżej. I myślę, że tak, ponieważ można obliczyć różnicę tych dwóch komórek, aby uzyskać 9.82254E-11. Ale oba są pokazane w ten sam sposób.

Jeśli program Excel pokazał pierwsze 17 cyfr, pomocne byłoby wybranie dokładnie tego, jaki numer IEEE jest „pod” liczbą dziesiętną. W tym wypadku:

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

Ale wyświetlenie 15 cyfr zaokrąglonych w niewłaściwy sposób jest mylące i nieprzydatne.


Zanim ktokolwiek twierdzi, że jest to celowe, to dlaczego 8.7nie wykazuje tego samego zachowania? Najbliższy numer podwójnej precyzji 8.7to:

8.69999999999999 93

powinien więc wyglądać, 8.69999999999999jakby było to zamierzone. Ale tak nie jest.

Jeppe Stig Nielsen
źródło
9
Masz rację, to błąd. Algorytmy konwersji binarnej liczby zmiennoprzecinkowej wyświetlającej najmniejszą liczbę cyfr znaczących są trudne, ale znane. Wygląda na to, że ktoś przegapił jakiś ważny szczegół.
Mark Ransom
2
@ Ruslan Widziałem wiele wątków na temat arytmetyki zmiennoprzecinkowej, na stosie przepełnienia stosu i innych stronach SE, i często ludzie udzielają odpowiedzi z wszelkiego rodzaju ogólnymi prawdami i pojęciami na temat (binarnych) liczb zmiennoprzecinkowych, bez odniesienia do faktycznych liczb oraz sprawdzenie, czy zachowanie jest zgodne z IEEE. Myślę, że mógłbym zadać pytanie „Dlaczego 2.1 + 2.2powraca 4.80000001?” i otrzymuję wiele odpowiedzi, mówiąc, że właśnie tego muszę się spodziewać, kiedy używam zmiennoprzecinkowego.
Jeppe Stig Nielsen
1
@benshepherd: zrzut ekranu LibreOffice nie pokazuje tego, co pokazuje zrzut ekranu programu Excel
Thomas Weller
1
@JeppeStigNielsen: 2,1 + 2,2 = 4,8? To tylko 0,5 zniżki. To normalne.
Thomas Weller
@MarkRansom: tak więc Excel naprawdę implementuje to samo? Excel nie jest zaimplementowany w C ++ ani czymś, co wykonuje dla niego obliczenia zmiennoprzecinkowe? Czy tak mówisz? Czy błąd jest już w C ++, więc wpływa na miliony aplikacji?
Thomas Weller
22

Excel przechowuje liczby w binarnym 64-bitowym formacie zmiennoprzecinkowym IEEE 754 . Kluczem jest „przechowywanie” - zmiana z dziesiętnej na dwójkową ma miejsce za każdym razem, gdy liczba jest przechowywana, a nie tylko wtedy, gdy jest używana do obliczeń.

Fajny artykuł na ten temat znajduje się w artykule Understanding Floating Point Precision, czyli „Dlaczego Excel wydaje mi się pozornie błędne odpowiedzi?”

Możliwe jest stworzenie programu do obsługi arkuszy kalkulacyjnych, który obsługiwałby naprawdę duże liczby z wieloma cyframi znaczącymi. Ale to nie jest zbyt praktyczne. Program Excel mógł zostać zaprojektowany do korzystania z formatu dziesiętnego 128 IEEE 754 , który pozwala na zapisanie 34 cyfr dziesiętnych - to więcej niż wystarcza do zapisania 22222,09482. Zamiast tego wykorzystuje o wiele bardziej popularny format Double Precision binary64 , który ma 53 bity precyzji, czyli nieco mniej niż 16 cyfr. Chociaż może się wydawać, że to wystarczy dla liczby zawierającej tylko 10 cyfr, konwersja z dziesiętnej na binarną nieco komplikuje rzeczy - tzn. 2222209482 może być przechowywany w 100% poprawnie jako liczba binarna64, ale 22222.09482 nie może.

Należy pamiętać, że zazwyczaj arkusze kalkulacyjne są używane do danych finansowych, które zwykle nie wymagają tak wielu cyfr precyzji lub do modelowania „co jeśli” w różnych scenariuszach, w których nie jest wymagany bardzo wysoki poziom precyzji. Z pewnością istnieją inne narzędzia (i prawdopodobnie inne programy do obsługi arkuszy kalkulacyjnych, ale ostatnio nie szukałem), które albo domyślnie, albo przy specjalnych ustawieniach konfiguracji mogą używać większego formatu liczbowego, ale Excel nie jest jednym z nich.

Dla tych, którzy podkreślają, że LibreOffice radzi sobie z tym lepiej, wygląd może być mylący. Zobacz ten post, aby uzyskać więcej informacji. Wydaje się, że LibreOffice traktuje duże liczby nieco inaczej, ale ma tę samą podstawową 64-bitową reprezentację zmiennoprzecinkową z podobnymi problemami.

manassehkatz-Reinstate Monica
źródło
3
Ta odpowiedź byłaby lepsza, gdyby wyjaśniała również obserwację, że niektóre liczby dziesiętne są pokazane dokładnie tak, jak zostały wprowadzone - takie jak 11111.09482 w przykładzie PO.
andrew
11
Dla zabawy: 22222.09482jest przechowywany jak 1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)w IEEE 754, czyli innymi słowy dokładnie tak 1.35632902954101553 * 2^14, jak jest 22222.0948199999984353787904.
YoYoYonnY
1
Binary64 (inaczej podwójna precyzja) to więcej niż wystarczająca liczba dziesiętna. Oczywiście nie można go dokładnie przedstawić, ale większość liczb, w tym 0.2i 0.1nie można dokładnie przedstawić (ułamek 1/5 (jedna piąta) ma nieskończone powtarzające się rozwinięcie binarne). Jednak Excel pokazuje rzeczy w mylący sposób.
Jeppe Stig Nielsen
2
„Należy pamiętać, że do danych finansowych zwykle wykorzystywane są arkusze kalkulacyjne, które zwykle nie wymagają tak wielu cyfr precyzji” - jest to na ogół bardzo błędne - dane finansowe wymagają precyzyjnego zachowania w tym sensie, że „to, co wpisujesz, jest tym, czego oczekujesz, pozostanie tam ", Masz rację z konwersją dziesiętną / binarną itp., Ale ten konkretny argument jest nieprawidłowy! W przypadku danych finansowych zwykle używamy jakiegoś formatu Moneylub BigIntegerformatu, który często używa formatu pamięci dziesiętnej .
Honza Zidek
4
Ta odpowiedź nie jest wystarczająca do wyjaśnienia, co się dzieje. Obserwujemy błąd w programie Excel, w którym liczba jest źle sformatowana . 22222.09482 i 22222.0948199999 są odrębnymi liczbami binarnymi64.
Ruslan
11

Podczas wykonywania obliczeń program Excel musi znaleźć dobrą wewnętrzną reprezentację binarną dla liczb, których używa. W twoim przypadku wykorzystuje liczbę zmiennoprzecinkową i faktycznie ten format danych ma (bardzo dobre) przybliżenie twojej liczby, ale nie ma ścisłego dopasowania. Jeśli więc nie powiesz wyraźnie Excelowi, którego formatu wyjściowego użyć, zrobi to „najlepiej”, uzyskując wynik, który jest bliższy wewnętrznie obliczonej wartości, ale nie jest dokładnie tym, co wpisujesz.

Żeby było jasne: zrozumienie, że wprowadzony tekst reprezentuje liczbę, a przekształcenie sekwencji cyfr na liczbę spełnia już definicję „obliczenia” z góry.

EDYTOWAĆ

Nie wyjaśniłem wystarczająco jasno, że uważam, że wybór użycia 64-bitowej reprezentacji zmiennoprzecinkowej jest naprawdę dobry: Excel nie jest narzędziem dla naukowców, w którym błąd zaokrąglenia w 11. cyfrze po przecinku powoduje duży wpływ, ale księgowi nie chcą, aby ich szybkość przetwarzania zmniejszyła się o milion razy, aby uwzględnić źródło niedokładnych obliczeń, które mogą przejawiać się w liczbach, których nigdy nie używają.

Jeśli użyjesz programu arkusza kalkulacyjnego do tego, do czego został zaprojektowany, i użyjesz jawnego formatowania wyjściowego, aby upewnić się, że te efekty nigdy nie znajdą się w widocznej sferze, nic ci nie będzie.

Eugen Rieck
źródło
1
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
DavidPostill
1
Ta odpowiedź nie jest wystarczająca do wyjaśnienia, co się dzieje. Obserwujemy błąd w programie Excel, w którym liczba jest źle sformatowana. 22222.09482 i 22222.0948199999 są odrębnymi liczbami binarnymi64.
Ruslan
2

Kiedy wprowadzę 11111.09482 i 66666.09482, 77777.09482 .. do 99999.09482, to pokażą się poprawnie. Nie jestem pewien, czy jest to związane z zaokrąglaniem? Nie ustawiłem żadnych profili zaokrąglania. Czy możesz mi pomóc w rozwiązaniu problemu.

Niektóre liczby mogą być reprezentowane poprawnie, a niektóre nie.

Ustaw wyświetlaną precyzję odpowiednio do swoich obliczeń i użyj funkcji round () .

  • Wyjaśnienie:

  • Rozwiązanie:

    Często można zapobiec wpływowi błędów zaokrąglania zmiennoprzecinkowego na pracę, ustawiając opcję Precyzja jako wyświetlana przed zastosowaniem formatu liczbowego do danych. Ta opcja wymusza, aby wartość każdej liczby w arkuszu była zgodna z dokładnością wyświetlaną w arkuszu.

    1. Kliknij Plik> Opcje.
      W programie Excel 2007: Kliknij obraz przycisku Microsoft Office Button Obraz przycisku Office, a następnie kliknij Opcje programu Excel.
      Obraz przycisku

    2. Kliknij opcję Zaawansowane, a następnie w obszarze Podczas obliczania tego skoroszytu zaznacz pole wyboru Ustaw dokładność zgodnie z wyświetlaniem, a następnie kliknij przycisk OK.

    3. Kliknij OK.

    4. W arkuszu wybierz komórki, które chcesz sformatować.

    5. Na karcie Narzędzia główne kliknij przycisk uruchamiania okna dialogowego Obraz przycisku obok numeru.
      Obraz przycisku uruchamiania
      Obraz wstążki programu Excel

    6. W polu Kategoria kliknij Liczba.

    7. W polu Miejsca dziesiętne wprowadź liczbę miejsc dziesiętnych, które chcesz wyświetlić.

    Wskazówka: Aby zminimalizować wszelkie skutki niedokładności arytmetycznej pamięci zmiennoprzecinkowej, możesz także użyć funkcji OKRĄGŁY, aby zaokrąglić liczby do liczby miejsc dziesiętnych wymaganej w obliczeniach.

  • Journal of Accountancy - „ Wystąpiły błędy obliczeniowe programu Excel ”:

    Niektóre liczby nieparzyste tworzą powtarzające się dziesiętne liczby binarne, a gdy te powtarzające się cyfry są odcinane po 15 miejscach, liczba binarna nie przelicza się dokładnie na zamierzoną wartość liczbową. Na przykład we wszystkich wersjach programu Excel formuła 22.26 - 21.29 powinna dawać 0,97, ale zamiast tego daje 0,970000000000002. Spróbuj i pamiętaj, aby zwiększyć szerokość kolumny i miejsca dziesiętne, aby zobaczyć problem z obliczeniami.

    Takie błędy są zwykle uważane za nieistotne lub nieistotne, ponieważ rzadko przejawiają się w znaczące błędy obliczeniowe; niemniej jednak oto dwie miary, które można podjąć, aby wyeliminować potencjalne błędy zmiennoprzecinkowe:

    1. Funkcja ROUND. Użyj funkcji OKRĄGŁEJ programu Excel, aby zaokrąglić obliczone wartości do pożądanego miejsca po przecinku, eliminując w ten sposób możliwość wystąpienia 15-cyfrowych anomalii. Na przykład formuła = OKRĄGŁY (-21,29 + 22,26) dokładnie daje 0,97.

    2. Precyzja. Możesz włączyć opcję Precyzja wyświetlanego programu Excel, aby wymusić obcięcie wszystkich formuł i zaokrąglenie obliczonych wartości na podstawie widocznych cyfr.

    Aby włączyć tę opcję w programach Excel 2013, 2010 i 2007, wybierz Plik (lub Kula pakietu Office), Opcje (lub Opcje programu Excel), Zaawansowane, aw sekcji Podczas obliczania tego skoroszytu zaznacz pole Ustaw dokładność jako wyświetlane i następnie kliknij OK.

    W programach Excel 2003, 2002 i 2000 z menu Narzędzia wybierz Opcje, a na karcie Obliczenia w obszarze Opcje skoroszytu zaznacz pole Precyzja zgodnie z wyświetleniem, a następnie kliknij przycisk OK.

Obrabować
źródło
1
Wyjaśnienie nie ma znaczenia: różnica między oczekiwanymi a uzyskanymi liczbami wynosi 28 ULP - zdecydowanie za dużo dla naturalnego błędu zaokrąglenia. „Rozwiązanie” po prostu ukrywa prawdziwy błąd.
Ruslan
Byłoby wspaniale, gdybyś mógł zamieścić to, wraz z kilkoma linkami wspierającymi twoją odpowiedź, jako własną odpowiedź zamiast komentarza. W ten sposób zwróciłoby uwagę użytkownika954171 i ludzie mogliby na niego głosować. Czy możesz podać link do raportu o błędzie?
Rob
Istnieje już odpowiedź zawierająca wszystkie istotne szczegóły matematyczne. Nie znam żadnych zgłoszeń błędów na ten temat.
Ruslan
0

Jak zapewne wiesz, komputery wewnętrznie działają tylko przy użyciu zer i jedynek (inaczej bitów) i mają stałą liczbę bitów reprezentujących wartość (zwykle obecnie 64 bity). Oznacza to, że liczba różnych wartości, które można przedstawić, wynosi 2 do 64 potęgi. To ogromna liczba, jasne, ale liczba możliwych wartości jest skończona, więc nie wszystkie liczby mogą być reprezentowane. Kiedy napotka liczbę, której nie może dokładnie przedstawić, zostanie automatycznie zastąpiona przez najbliższą, którą może reprezentować. Właśnie to widzisz.

Javier Alvarado
źródło
Czy twierdzisz, że jest to spowodowane konwersją bazy liczbowej lub ograniczoną ilością pamięci na wartość? W obu przypadkach twoje rozumowanie jest błędne. Technicznie jest całkowicie możliwe, aby mieć dowolną dokładność i dowolną liczbę długości - przy założeniu nieskończonej pamięci. Jako przykład podajemy bignum GNU. Ponadto nie ma nieodłącznej potrzeby kodowania liczb w formacie stratnym. Tak więc nie ma winy informatyki ani liczb binarnych. Tylko programiści programu Excel wybrali kodowanie liczb, które jest utratą danych wprowadzanych przez użytkownika.
fresnel
-1

Komputery wykonują obliczenia matematyczne w trybie binarnym i prawie zawsze używają liczb zmiennoprzecinkowych dla wartości niecałkowitych. Jedyne wartości ułamkowe, które można dokładnie przedstawić w postaci zmiennoprzecinkowej, muszą być sumą pewnej kombinacji mocy ułamkowej o wartości 2 (1/2, 1/4, 1/8, 1/16, 1/32, ...) kończącej się przy zaprojektowanym limicie precyzji (zwykle 53 bity). Wartości te nie zawsze mają uporządkowaną lub dokładną reprezentację dziesiętną, i odwrotnie, nie wszystkie wartości ułamkowe, które można dokładnie przedstawić w postaci dziesiętnej, będą miały dokładną reprezentację w postaci binarnej. Na przykład: 0,1. Nie można go przedstawić jako sumę ułamkowych potęg 2, które nie trwają wiecznie.

Po wprowadzeniu wartości dziesiętnej do arkusza kalkulacyjnego zostanie ona przekonwertowana i zapisana w postaci binarnej, a przypadki, takie jak opisane, staną się najbliższym przybliżeniem, które można przedstawić w postaci binarnej. Po wyświetleniu jest konwertowany z powrotem na dziesiętny, ponownie wymagając przybliżenia, co może nie konwertować z powrotem dokładnie na tę samą reprezentację, którą wprowadziłeś.

Dlaczego 53 bity (dawać lub brać)? Ponieważ typowy standard do przechowywania zmiennoprzecinkowego „podwójnej precyzji” wykorzystuje 64 bity, w których występuje mantysa (zwana także znaczeniem), wskaźnik znaku i wykładnik potęgi. Wykładnik zwykle przypisuje się 10 bitów, znak zajmuje jeden, pozostawiając 53 dla mantysy. To jest do przechowywania. Obliczenia są zwykle wykonywane przy użyciu 80 bitów i zaokrąglane do tyłu.

Są sytuacje, w których komputery będą działać w bazie 10, szczególnie podczas pracy z wartościami pieniężnymi, w których artefakty zaokrąglania są niedopuszczalne.

Zenilogix
źródło
2
Nie zgadzam się z oświadczeniem dotyczącym wszystkich komputerów . Było wiele komputerów, co prawda większość nie jest już w użyciu, z wyjątkiem muzeów, które używały dziesiętnych formatów numerycznych do przechowywania i obliczeń. Istnieją również BCD - Binary Coded Decimal - stosowane w wielu nowszych procesorach, w tym ograniczone użycie w procesorach Intel. Żadna z tych informacji nie ma związku z bieżącym pytaniem - metoda używana przez program Microsoft Excel do przechowywania liczb, która jest w całości binarna. Ale „Wszystkie komputery” są nieprawidłowe.
manassehkatz-Reinstate Monica
Widzę zmianę z „Wszystkie komputery” na „Komputery” - wybrałbym „Prawie wszystkie komputery” lub „Większość nowoczesnych komputerów” lub coś w tym rodzaju. Wiem - jestem wybredna. Ale są też komputery :-)
manassehkatz-Reinstate Monica
@manassehkatz Wszystkie komputery cyfrowe są zasadniczo binarne. BCD jest tylko strukturą base-10 na górze pliku binarnego, aby ułatwić arytmetykę dziesiętną.
Zenilogix,
Podczas gdy wszystkie komputery cyfrowe są zasadniczo binarne, w rzeczywistości było całkiem sporo na początku, które były oparte na liczbach dziesiętnych. Ale zgadzam się, że BCD jest zasadniczo strukturą base-10 na górze pliku binarnego, aby ułatwić arytmetykę dziesiętną.
manassehkatz-Reinstate Monica
Ta odpowiedź brzmi, jakby to była wina komputera. Ale tak nie jest. Możesz dokładnie przedstawić dowolną liczbę, którą możesz napisać na papierze (dokładnie 1/3 - łatwe przy przechowywaniu jako ułamek, np.). Tak naprawdę chodzi o to, jaką reprezentację autorzy Excela wybrali do reprezentowania liczb.
fresnel
-1

Jak wielu powiedziało powyżej, jest to wewnętrzny błąd reprezentacji. Excel dokonał wyboru 64-bitowych liczb zmiennoprzecinkowych o podwójnej precyzji. To daje 2 64 możliwe wartości. Domena liczb rzeczywistych zawiera nieskończoną liczbę wartości, więc gdy spróbujesz użyć takiej, która nie może być reprezentowana przez Excel, użyje najbliższej, którą można przedstawić.

Widziałem komentarze mówiące, że przy nieskończonej pamięci można przedstawić dowolną liczbę rzeczywistą. To prawda, ale nie ma czegoś takiego jak „nieskończona pamięć”, więc jest to kwestia sporna. Inni stwierdzili, że Excel mógł użyć większej reprezentacji wewnętrznej, na przykład 128-bitowej. To prawda, ale okazuje się, że komputery lepiej wykonują operacje matematyczne na liczbach reprezentowanych przez liczbę bitów odpowiadającą wielkości magistrali procesora. Tak więc komputer 32-bitowy będzie najszybszy w operacjach matematycznych na liczbach 32-bitowych, a komputer 64-bitowy będzie najszybszy w operacjach matematycznych na liczbach 64-bitowych. Jeśli i kiedy będzie komputer 128-bitowy, możemy spodziewać się, że Excel przejdzie do reprezentacji liczby 128-bitowej. Zapewni to nadal bardzo duży, ale ograniczony zestaw liczb, które mogą być reprezentowane.

Jeśli obawiasz się, jak wyglądają liczby w arkuszu kalkulacyjnym, to zastosowanie określonej precyzji (liczby miejsc po przecinku) zapewni spójne wyniki. Jeśli martwisz się różnicą między liczbą, którą wpisujesz, a rzeczywistą liczbą przechowywaną przez program Excel, masz rację. Różnica jest prawdziwa, a błąd zostanie przeniesiony przez wszelkie wykonane obliczenia. Obawiam się, że utknąłeś z tym błędem. Jest to ograniczenie programu Excel, a nie błąd, jak niektórzy stwierdzili. Prawdopodobnie nie zmieni się to w najbliższym czasie, więc jeśli jest to dla Ciebie niedopuszczalne, sugeruję poszukać innej aplikacji do arkuszy kalkulacyjnych, która może przedstawiać liczby z większą precyzją. Pamiętaj jednak, że jeśli znajdziesz taką aplikację, ograniczenie nadal istnieje. Tylko rozmiar błędu jest inny.

Tibi
źródło