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.
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.
microsoft-excel
microsoft-excel-2016
użytkownik954171
źródło
źródło
ROUND()
?=ROUND(A1,5)
, a następnie skopiować / wkleić dane jako Wartości i usunąć oryginalne liczby?ROUND()
pokazuje poprawne cyfry, ale wartość kopiuj / wklej jako przywraca pierwotny numer!ROUND(A1,5)
ponownie wklejone wartości. Następnie skopiuj / wklej je jako wartości, aRound()
następnie ponownie skopiuj / wklej. ...: P ... to interesujące i wygląda na to, że @EugenRieck ma uzasadnienie. Fajne pytanie!double
ma wystarczającą precyzję, że po zaokrągleniu pokazuje prawidłowe wartości, jakich oczekuje większość ludziOdpowiedzi:
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:
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:
Aby rozwinąć tę kwestię, spróbuj wpisać
22222.09482
jedną komórkę, a22222.0948199999
drugą (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:
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.7
nie wykazuje tego samego zachowania? Najbliższy numer podwójnej precyzji8.7
to:powinien więc wyglądać,
8.69999999999999
jakby było to zamierzone. Ale tak nie jest.źródło
2.1 + 2.2
powraca4.80000001
?” i otrzymuję wiele odpowiedzi, mówiąc, że właśnie tego muszę się spodziewać, kiedy używam zmiennoprzecinkowego.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.
źródło
22222.09482
jest przechowywany jak1.0101101100111000011000010001100001111110011111000000₂ * 2₁₀^(10000001101₂ - 1023₁₀)
w IEEE 754, czyli innymi słowy dokładnie tak1.35632902954101553 * 2^14
, jak jest22222.0948199999984353787904
.0.2
i0.1
nie 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.Money
lubBigInteger
formatu, który często używa formatu pamięci dziesiętnej .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.
źródło
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:
Wikipedia - „ Precyzja numeryczna w Microsoft Excel ”
Przewodnik po obliczeniach numerycznych Oracle - „ Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej ”
Rozwiązanie:
Journal of Accountancy - „ Wystąpiły błędy obliczeniowe programu Excel ”:
źródło
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.
źródło
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.
źródło
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.
źródło