2012-05-26 10 views
5

Występują błędy zaokrąglania podczas używania doFixed:toFixed (2) runduje "x.525" niekonsekwentnie?

Użyłem toFixed(2) dla moich obliczeń wartości numerycznych, ale wyniki zaokrąglania nie są zgodne z oczekiwaniami dla kilku przypadków.

Załóżmy, że toFixed(2) jest stosowana do wartości 17.525 to daje wynik 17.52, a jeśli jest stosowana dla 5.525 to daje wynik 5.53.

W tym ostatnim przypadku wynik zaokrąglenia jest dokładny, więc proszę zasugerować, co należy zrobić, aby uzyskać dokładny wynik zaokrągleń, jak w przypadku późniejszym. Czy możesz zaproponować alternatywę do tej funkcji FIXed, aby uzyskać prawidłowe wyniki zaokrąglania?

+1

FYI, to nie ma nic wspólnego z jQuery. Jest to funkcja JavaScript https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed. – alexn

+2

Wynik jest całkowicie w porządku. Liczby zmiennoprzecinkowe typu Mantissa są kłamstwem. Spróbuj 'toFixed (20)', a następnie porównaj. –

+0

możliwy duplikat [Używanie do Zaszyfrowania (2) i runda matematyczna, aby uzyskać prawidłowe zaokrąglenie] (http://stackoverflow.com/questions/2861055/using-tofixed2-and-math-round-to-get-correctround) –

Odpowiedz

4

pływający punkt niedokładność oznacza, że ​​większość numerów kończące .525 są rzeczywiście .52500..1, a inne są 0,5249999 .....

Którędy Rundy wartość zależy od tego, czy najbliższą rzeczywistej reprezentacji w IEEE -754 zmiennoprzecinkowe jest powyżej lub poniżej pożądanej wartości.

+2

Czy istnieje dobry sposób, aby zaokrąglić do, a następnie? –

+0

'17.525.to Naprawiono (3)' '" 17.525 "' Upuszczenie ostatniej cyfry daje '" 17.52 "' która jest nieprawidłowa? Dostaję różne wyniki w różnych przeglądarkach, więc wątpię, aby 'to Naprawiono' było dobre: ​​P – Esailija

+0

@Eailailija nie, myślę, że 17.52 byłoby poprawną odpowiedzią w takim przypadku. – Alnitak

1

Konwersja numeru na ciąg i praca z nim?

To ostatnia deska ratunku po tym, jak spróbowałem użyć Math.round lub zasymulować najbliższe zaokrąglenie z Math.ceil, ale nie udało się. Przy pomnożeniu przez 100, pewna liczba (np. 17,525) będzie nieco mniejsza niż 100-krotność jego wartości (1752,5), podczas gdy inne liczby (np. 17.545) będą nieco ponad 100 razy większe od jego wartości (1754.5).

+0

Nie jestem do końca pewien, w jaki sposób przekonwertowanie liczb na ciągi znaków mogłoby pomóc ... wydaje się, że więcej pracy. –

+0

Będziemy pracować na reprezentacji dziesiętnej zamiast binarnej reprezentacji liczby. Jest to "poprawne wizualnie", gdy drukujemy wartość przed i po zaokrągleniu. – nhahtdh

3

Zamiast toFixed() użycie Math.ceil(), Math.floor() lub Math.round()

przy drodze wokół jak

var rnum = 5.525, 
    decimalPlaces = 2, 
    factor = Math.pow(10, decimalPlaces), 
    newnumber = Math.round(rnum * factor)/factor, 
    mydecimalvalue = parseFloat(newnumber); 

wynik jest 5.53

+0

Ale te zwracane liczby całkowite ... jak można je tutaj zastosować? –

+0

Tak, ale ten odnośnik dotyczy 'toFixed (0)', a nie 'toFixed (2)' ... –

+0

Po pomnożeniu liczby przez 100, liczba już traci dokładność, więc użycie tych metod naprawdę nie pomaga . – nhahtdh