w JavaScript typowym sposobem zaokrągleń liczby do N miejsc dziesiętnych jest:
function roundNumber(num, dec) {
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
Jednak to podejście zaokrągli maksymalnie do N miejsc dziesiętnych, podczas gdy ja chcę zawsze zaokrąglić do N miejsc dziesiętnych. Na przykład „2,0” zostanie zaokrąglone do „2”.
Jakieś pomysły?
toFixed()
( developer.mozilla.org/En/Core_JavaScript_1.5_Reference/… ), ale w IE jest to błędne: stackoverflow.com/questions/661562/… ; będziesz musiał napisać własną wersję ...Odpowiedzi:
To nie jest problem z zaokrągleniem, to jest problem z wyświetlaniem. Liczba nie zawiera informacji o cyfrach znaczących; wartość 2 jest taka sama jak 2,0000000000000. To wtedy, gdy zamienisz zaokrągloną wartość na ciąg, sprawisz, że wyświetli określoną liczbę cyfr.
Możesz po prostu dodać zera po liczbie, na przykład:
(Należy zauważyć, że przy założeniu, że ustawienia regionalne klienta używają kropki jako separatora dziesiętnego, kod wymaga trochę więcej pracy, aby działał dla innych ustawień).
źródło
toFixed()
do uzupełniania ułamków dziesiętnych na końcu, po zaokrągleniu?1.02449999998.toFixed(4)
poprawnie wraca1.0245
.Myślę, że istnieje prostsze podejście do wszystkich podanych tutaj i jest to metoda
Number.toFixed()
już zaimplementowana w JavaScript.po prostu napisz:
itp...
źródło
toFixed()
zwraca ciąg.Znalazłem drogę. Oto kod Christopha z poprawką:
Przeczytaj szczegóły dotyczące powtarzania znaku przy użyciu konstruktora tablicy , jeśli jesteś ciekawy, dlaczego dodałem „+ 1”.
źródło
Zawsze jest lepszy sposób na robienie rzeczy.
Chciałbym uzyskać dokładność czterech cyfr: 51,94
po prostu zrób:
wynikiem będzie: 51,94
źródło
Metoda zaokrąglania podobna do PHP
Poniższy kod może służyć do dodawania własnej wersji Math.round do własnej przestrzeni nazw, która przyjmuje parametr precyzji. W przeciwieństwie do zaokrąglania dziesiętnego w powyższym przykładzie, nie powoduje to konwersji do iz ciągów, a parametr precyzji działa tak samo jak PHP i Excel, gdzie dodatnia 1 zaokrągliłaby do 1 miejsca dziesiętnego, a -1 do dziesiątek.
z dokumentacji Mozilla Developer dla Math.round ()
źródło
Mam nadzieję, że działający kod (nie wykonał zbyt wielu testów):
źródło
Myślę, że poniżej funkcja może pomóc
użycie:
roundOff(600.23458,2);
powróci600.23
źródło
Działa to w przypadku zaokrąglania do N cyfr (jeśli chcesz tylko skrócić do N cyfr, usuń wywołanie Math.round i użyj Math.trunc):
Musiałem uciekać się do takiej logiki w Javie w przeszłości, kiedy tworzyłem komponenty E-Slate do manipulacji danymi . Dzieje się tak, ponieważ odkryłem, że dodając wiele razy 0,1 do 0, otrzymujesz nieoczekiwanie długą część dziesiętną (jest to spowodowane arytmetyką zmiennoprzecinkową).
Komentarz użytkownika pod numerem Format, aby zawsze pokazywać 2 miejsca po przecinku, wywołuje tę technikę skalowania.
Niektórzy wspominają, że istnieją przypadki, które nie zaokrągla się zgodnie z oczekiwaniami, a na http://www.jacklmoore.com/notes/rounding-in-javascript/ sugeruje się zamiast tego:
źródło
Jeśli naprawdę nie zależy ci na zaokrąglaniu, po prostu dodaj toFixed (x), a następnie usuń końcowe zera i kropkę, jeśli to konieczne. Nie jest to szybkie rozwiązanie.
źródło
format(1.2, 5)
i dostałem1.2
, póki się spodziewałem1.20000
.