W JavaScripcie, jak przekonwertować zmiennoprzecinkowe na ciąg, w jaki sposób mogę uzyskać tylko 2 cyfry po przecinku? Na przykład 0,34 zamiast 0,3445434.
427
W JavaScripcie, jak przekonwertować zmiennoprzecinkowe na ciąg, w jaki sposób mogę uzyskać tylko 2 cyfry po przecinku? Na przykład 0,34 zamiast 0,3445434.
Odpowiedzi:
Szczegóły , w przypadku gdy kod nie jest zrozumiały.
edytuj: ... lub po prostu użyj
toFixed
, jak zaproponował Tim Büthe . Zapomniałem tego, dziękuję (i głosowanie) za przypomnienie :)źródło
toFixed()
naśladuje to, coprintf()
robi coś w C. JednaktoFixed()
iMath.round()
zaokrągla inaczej. W takim przypadkutoFixed()
będzie miał taki sam efektMath.floor()
, jaki miałbyś (zakładając, że wcześniej pomnożono oryginał przez 10 ^ n i dzwonisz zatoFixed()
pomocą n cyfr). „Poprawność” odpowiedzi jest bardzo zależna od tego, czego chce tu PO, i oba są „poprawne” na swój sposób.Istnieją funkcje zaokrąglania liczb. Na przykład:
wydrukuje 5.04.
EDYTOWAĆ: Skrzypce
źródło
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
będzie równy"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
…Zachowaj ostrożność, używając
toFixed()
:Po pierwsze, zaokrąglanie liczby odbywa się za pomocą binarnej reprezentacji liczby, co może prowadzić do nieoczekiwanego zachowania. Na przykład
zamiast
'0.6'
.Po drugie, występuje błąd IE
toFixed()
. W IE (przynajmniej do wersji 7 nie sprawdzono IE8) spełnione są następujące warunki:Dobrym pomysłem może być skorzystanie z sugestii kkyy lub użycie niestandardowej
toFixed()
funkcji, npźródło
.toFixed()
metody natywnej do wartości zwracanej, która doda wymaganą dokładność, np .:return (Math.round(value * power) / power).toFixed(precision);
a także zwróci wartość jako ciąg znaków. W przeciwnym razie precyzja 20 jest ignorowana dla mniejszych miejsc po przecinkutoFixed
: zauważ, że zwiększenie precyzji może przynieść nieoczekiwane rezultaty:(1.2).toFixed(16) === "1.2000000000000000"
podczas gdy(1.2).toFixed(17) === "1.19999999999999996"
(w Firefox / Chrome; w IE8 ta ostatnia nie działa z powodu niższej precyzji, którą IE8 może zaoferować wewnętrznie).(0.598).toFixed(2)
nie produkuje0.6
. Produkuje0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Kolejnym problemem, o którym należy pamiętać, jest to, że
toFixed()
może generować niepotrzebne zera na końcu liczby. Na przykład:Chodzi o to, aby wyczyścić dane wyjściowe za pomocą
RegExp
:RegExp
Dopasowuje zer (i opcjonalnie przecinek), aby upewnić się, że wygląda dobrze dla liczb całkowitych, jak również.źródło
źródło
Problem polega na tym, że wszystkie te rozwiązania zmieniają się przy użyciu mnożników. Rozwiązania zarówno Kkyy, jak i Christopha są niestety błędne.
Sprawdź kod pod kątem liczby 551.175 z 2 miejscami po przecinku - zaokrągli on do 551.17, a powinien mieć 551,18 ! Ale jeśli testujesz na ex. 451,175 wszystko będzie dobrze - 451,18. Dlatego trudno jest zauważyć ten błąd na pierwszy rzut oka.
Problem polega na pomnożeniu: spróbuj 551,175 * 100 = 55117.49999999999 (ups!)
Więc moim pomysłem jest potraktowanie go za pomocą toFixed () przed użyciem Math.round ();
źródło
toFixed
to również wpływa -(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
… Bez względu na zastosowaną metodę, lepiej dodać epsilon przed zaokrągleniem.Wydaje mi się, że kluczem jest prawidłowe zaokrąglenie w górę, a następnie konwersja do String.
Teraz możesz bezpiecznie sformatować tę wartość za pomocą toFixed (p). W przypadku konkretnego przypadku:
źródło
Jeśli chcesz ciąg bez rundy, możesz użyć tego RegEx (może nie jest to najbardziej wydajny sposób ... ale jest naprawdę łatwy)
źródło
źródło
return float_part ? int_part+'.'+float_part : int_part;
inaczej jeśli przeszedł całkowitą, to zwrócony liczby z kropką na końcu (na przykład wejście:2100
, moc:2100.
)Może chcesz też separator dziesiętny? Oto funkcja, którą właśnie stworzyłem:
źródło
Nie ma sposobu, aby uniknąć niespójnego zaokrąglania cen z wartością x.xx5 jako wartością rzeczywistą za pomocą mnożenia lub dzielenia. Jeśli musisz obliczyć prawidłowe ceny po stronie klienta, powinieneś zachować wszystkie kwoty w centach. Wynika to z natury wewnętrznej reprezentacji wartości liczbowych w JavaScript. Zauważ, że Excel ma te same problemy, więc większość ludzi nie zauważy małych błędów spowodowanych tym zjawiskiem. Jednak błędy mogą się kumulować, ilekroć dodasz dużo obliczonych wartości, istnieje cała teoria obejmująca kolejność obliczeń i inne metody, aby zminimalizować błąd w wyniku końcowym. Aby podkreślić problemy z wartościami dziesiętnymi, należy pamiętać, że 0,1 + 0,2 nie jest dokładnie równe 0,3 w JavaScript, podczas gdy 1 + 2 jest równe 3.
źródło
źródło
Używam tego kodu do formatowania liczb zmiennoprzecinkowych. Opiera się na,
toPrecision()
ale usuwa niepotrzebne zera. Z zadowoleniem przyjmuję sugestie dotyczące uproszczenia wyrażenia regularnego.Przykład użycia:
źródło