2015-04-08 21 views
5

Więc mam skrypt JavaScript, który dodaje małe frakcje razem w pętli i możliwe, że doda od 0,2 do 0,1. Następnie ta wartość jest podawana do innej funkcji, ale problem jest potrzebny, aby podać 0.3, a nie 0.30000000000000004.Jaki jest najlepszy sposób radzenia sobie z błędami zmiennoprzecinkowymi?

Jaki jest najprostszy sposób, aby upewnić się, że liczba jest poprawiona i dokładna. Zauważ, że możliwe jest dodanie 0,25 + 0,125 itd., Dodanych do zwykłego zaokrąglenia do 1 miejsca po przecinku, nie rozwiąże problemu.

Możliwe jest również dodanie 0.2 + 0.10000000000000004, chociaż jest to bardzo mało prawdopodobne!

+1

0,25 + 0,125 to nietypowy i prosty przypadek. Obie wartości i ich suma są dokładnie reprezentowalne, więc nie ma błędu zaokrąglania. Tak nie jest w przypadku 0.3. Najbliżej można uzyskać 0.299999999999999988897769753748434595763683319091796875. Czy to wystarczająco blisko? –

+1

To nie jest rozwiązanie, ale bardziej głupia matematyka, tym dokładniejsza – Downgoat

+2

W jaki sposób tworzone są twoje małe liczby? możesz lepiej pomnożyć wszystko przez '1000' –

Odpowiedz

1

Nie ma prostej metody unikania błędów zaokrąglania w arytmetyce zmiennoprzecinkowej ogólnego zastosowania. Numer 0.3 nie ma dokładnej binarnej reprezentacji zmiennoprzecinkowej.

Sugerowałbym przeczytanie What Every Computer Scientist Should Know About Floating-Point Arithmetic, aby zapoznać się z kompromisami związanymi z reprezentacją liczb w liczbach zmiennoprzecinkowych.

Aby właściwie rozwiązać problem, należy zadać sobie kilka pytań:

  • Jak ścisły jest Twój wymóg precyzji? Dlaczego jest 0.30000000000000004 poza twoim marginesem błędu? Czy dopuszczalne jest zaokrąglanie wyników?
  • Czy istnieje sposób, w jaki można reprezentować liczby i wykonywać większość arytmetycznych liczb całkowitych? Na przykład. jeśli wiesz, że będziesz napotykał tylko racjonalne liczby, mogą być reprezentowane przy użyciu ilorazu całkowitoliczbowego i mianownika całkowitoliczbowego. Stamtąd możesz próbować odroczyć rzutowanie tak, aby było jak najdłużej, aby zapobiec zbiorczym błędom zaokrąglania.
  • Jeśli nie możesz wykonać obliczeń na liczbach całkowitych, czy istnieje alternatywny typ danych, którego możesz użyć, na przykład BigDecimal?

Ostatecznie, jeśli chodzi o problemy z precyzją zmiennoprzecinkową, często trzeba dostosować rozwiązanie do wymagań stawianych przez konkretny problem.

Powiązane problemy