2011-07-05 12 views
5

Tworzę aplikację budżetu z javascript. Muszę pozwolić javascript wykonać większość operacji. Mam więc pewne elementy sterujące, w których użytkownik zmienia żądaną kwotę dla kategorii, a moja aplikacja pokazuje nowe kwoty dla podkategorii. Więc jeśli mam + Auto $ 50.23 - Gaz $ 30.25 - Konserwacja $ 6,27 - Ubezpieczenia $ 10,02 - ...Operacje walutowe za pomocą javaScript?

Więc jeśli użytkownik zmieni Auto 50.23 do 90.00, kwoty za gaz, konserwacji, ubezpieczenia, etc odzwierciedlałoby wzrost procentowy w ich kategorii macierzystej.

Problem polega na tym, że po kilku operacjach tracę precyzję i powoduje ona pewne nieprzyjemne błędy. Zazwyczaj liczby nie sumują się (tak jak powinny). Po zmianie kwoty na auto kilka razy, a następnie ustawieniu na 0, pozostałe kwoty nie zawsze idą do 0, a czasami spadają poniżej 0, dając mi NaN, więc jeśli później zmienię Auto na coś większego niż 0, mój NaN pozostanie NaN.

Właśnie usłyszałem, że ktoś mówi, że ułamki w javascript są przybliżeniami, co jest kolejnym problemem. Próbowałem google sprawdzić, czy to jest fakt, ale nie mogłem znaleźć niczego (może nie szukałem odpowiednich warunków).

Jestem pewien, że niektórzy z was wpadli na podobne problemy, co byście zrobili sugerować? Ktoś zasugerował, aby pomnożyć moją oryginalną liczbę przez 100, a następnie wykonać wszystkie operacje, ale obawiam się, że to nie pomoże mi uciec z problemem utraty precyzji.

Wszelkie pomysły?

Doceniam twoją pomoc!

+0

Każda liczba w JS jest liczbą zmiennoprzecinkową, ale nie powinieneś tracić tak dużej precyzji na liczbach 2-miejscowych. Potrzebne są dosłownie tysiące lub miliony iteracji, zanim zaokrąglenie FP stanie się problemem. Czy możesz pokazać odpowiedni fragment kodu, w którym wykonujesz obliczenia? Nie potrzebujemy całej strony, tylko odrobinę. –

+0

cóż, prawdopodobnie możesz stworzyć własną klasę z właściwościami takimi jak dolary i centy (wszystkie liczby całkowite) i implementować własne operacje – spacevillain

+0

Błędy dodatków fp są najczęściej zgłaszanymi błędami w javascript. – jzilla

Odpowiedz

9

Liczby zmiennoprzecinkowe binarne są nieudolne w posługiwaniu się ułamkami dziesiętnymi, więc 0,1 + 0,2 nie jest równe 0,3. Jest to najczęściej zgłaszany błąd w JavaScript i jest to celowa konsekwencja przyjęcia standardu IEEE dla binarnej zmiennoprzecinkowej (IEEE 754). Ten standard jest dobrze dopasowany do wielu aplikacji , ale narusza większość rzeczy, o których dowiedziałeś się w szkole średniej. Na szczęście, całkowita arytmetyczna liczba zmiennoprzecinkowa jest dokładna, więc można uniknąć dziesiętnych błędów reprezentacji przez skalowanie. Na przykład wartości dolara można konwertować na wartości całych centów, mnożąc je przez 100. Centów następnie można dokładnie dodać. Suma może być podzielona przez 100, aby przeliczyć z powrotem na dolary. Ludzie mają uzasadnione oczekiwania, gdy liczą pieniądze, że wyniki będą dokładne.

"JavaScript: dobre części Douglasa Crockforda Copyright 2008 Yahoo! Inc., 978-0-596-51774-8."

3

Zawsze z walutą śledzić ją jako liczby całkowite wewnętrznie. Wszystkie operacje powinny być wykonywane na liczbach całkowitych. Licznik dziesiętny ma tylko wartość wyświetlaną.

check out this fiddle jeśli myślisz o użyciu miejsc dziesiętnych do śledzenia pieniędzy.

+0

Tutaj jest aktualizowane skrzypce: http://jsfiddle.net/PfPbt/15/ gdzie można zobaczyć różnicę i zalecane rozwiązanie. –

Powiązane problemy