Mam ten wiersz kodu, który zaokrągla moje liczby do dwóch miejsc po przecinku. Ale dostaję takie liczby: 10,8, 2,4 itd. To nie jest mój pomysł na dwa miejsca po przecinku, więc jak mogę poprawić następujące?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Chcę liczb takich jak 10.80, 2.40 itd. Korzystanie z jQuery jest dla mnie w porządku.
0.565
,0.575
,1.005
), mogę zasugerować patrząc znowu na tej odpowiedzi , która dostaje je poprawić?number.toFixed(x)
metody do przekonwertowania go na ciąg znaków z wymaganą liczbą zer. Np. Zaokrąglij1.34
do1.3
metody przeglądarką, a następnie dodaj 1 zero i przekonwertuj na ciąg za pomocą1.3.toFixed(2)
(aby uzyskać"1.30"
).Odpowiedzi:
Aby sformatować liczbę za pomocą notacji ze stałym punktem, możesz po prostu użyć metody toFixed :
Zauważ, że
toFixed()
zwraca ciąg.WAŻNE : Należy pamiętać, że toFixed nie zaokrągla 90% czasu, zwraca zaokrągloną wartość, ale w wielu przypadkach nie działa.
Na przykład:
2.005.toFixed(2) === "2.00"
AKTUALIZACJA:
Obecnie możesz korzystać z
Intl.NumberFormat
konstruktora. Jest to część specyfikacji interfejsu API internacjonalizacji ECMAScript (ECMA402). Ma całkiem dobre wsparcie przeglądarki , w tym nawet IE11 i jest w pełni obsługiwana w node.js .Alternatywnie możesz użyć
toLocaleString
metody, która wewnętrznie będzie korzystać zIntl
interfejsu API:Ten interfejs API zapewnia także szeroki wybór opcji formatowania, takich jak tysiące separatorów, symbole walut itp.
źródło
(0.09).toFixed(1);
Daje 0,0 w IE8Math.Round(0.09)
wróci,0
więc to zawsze da0.0
...Math.round(value*100)/100
działa lepiej dla 2DP.Jest to stary temat, ale wciąż najwyższe pozycje w wynikach Google, a oferowane rozwiązania mają ten sam problem dziesiętnych liczb zmiennoprzecinkowych. Oto (bardzo ogólna) funkcja, której używam dzięki MDN :
Jak widzimy, nie występują następujące problemy:
Ta generyczność zapewnia również kilka fajnych rzeczy:
Teraz, aby odpowiedzieć na pytanie PO, należy wpisać:
Lub, dla bardziej zwięzłej, mniej ogólnej funkcji:
Możesz to nazwać za pomocą:
Różne przykłady i testy (dzięki @ tj-crowder !):
Pokaż fragment kodu
źródło
Zazwyczaj dodaję to do mojej osobistej biblioteki, a po kilku sugestiach i użyciu rozwiązania @TIMINeutron, a następnie dostosowaniu go do długości dziesiętnej, ta najlepiej pasuje:
będzie działać dla zgłoszonych wyjątków.
źródło
Nie wiem, dlaczego nie mogę dodać komentarza do poprzedniej odpowiedzi (być może jestem beznadziejnie ślepy, nie wiem), ale wpadłem na rozwiązanie, używając odpowiedzi @ Miguela:
I jego dwa komentarze (z @bighostkim i @Imre):
precise_round(1.275,2)
brakiem zwrotu 1.28precise_round(6,2)
nie zwracaniem 6.00 (tak jak chciał).Moje ostateczne rozwiązanie jest następujące:
Jak widać musiałem dodać trochę „korekty” (to nie jest to, co to jest, ale ponieważ Math.round jest stratny - możesz to sprawdzić na jsfiddle.net - to jedyny sposób, w jaki wiedziałem, jak to naprawić " to). Dodaje 0,001 do już wypełnionej liczby, więc dodaje
1
trzy0
s po prawej stronie wartości dziesiętnej. Dlatego powinien być bezpieczny w użyciu.Następnie dodałem,
.toFixed(decimal)
aby zawsze wyświetlać liczbę we właściwym formacie (z odpowiednią liczbą miejsc po przecinku).To tyle. Wykorzystaj to dobrze;)
EDYCJA: dodano funkcjonalność do „korekty” liczb ujemnych.
źródło
precise_round(1.27499,2)
Teraz zwraca również 1,28 ... To nieMath.round
jest stratne; sposób, w jaki komputery wewnętrznie przechowują wartości zmiennoprzecinkowe, jest. Zasadniczo jesteś skazany na niepowodzenie z niektórymi wartościami, zanim dane dotrą nawet do Twojej funkcji :)Jednym ze sposobów na uzyskanie 100% pewności, że otrzymasz liczbę z 2 miejscami po przecinku:
Jeśli powoduje to błędy zaokrąglania, możesz użyć następujących elementów, jak wyjaśnił James w swoim komentarzu:
źródło
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Użyj tej metody poniżej
A jeśli chcesz, aby numer był stały, użyj
źródło
Nie znalazłem dokładnego rozwiązania tego problemu, więc stworzyłem własne:
Przykłady:
źródło
@heridev i ja stworzyliśmy małą funkcję w jQuery.
Możesz spróbować dalej:
HTML
jQuery
DEMO ONLINE:
http://jsfiddle.net/c4Wqn/
źródło
input
wydarzenia. Nie powoduje to efektu migotania, a także strzela, gdy wchodzisz na pole za pomocą JSProblem z wartościami zmiennoprzecinkowymi polega na tym, że próbują one reprezentować nieskończoną liczbę (ciągłych) wartości za pomocą stałej liczby bitów. Więc oczywiście musi być jakaś strata w grze, a ty ugryziesz się z pewnymi wartościami.
Gdy komputer przechowuje 1,275 jako wartość zmiennoprzecinkową, tak naprawdę nie będzie pamiętał, czy był to 1.275, czy 1.27499999999999993, czy nawet 1.27500000000000002. Wartości te powinny dawać różne wyniki po zaokrągleniu do dwóch miejsc po przecinku, ale nie będą, ponieważ dla komputera wyglądają dokładnie tak samo po zapisaniu jako wartości zmiennoprzecinkowe i nie ma możliwości przywrócenia utraconych danych. Wszelkie dalsze obliczenia będą tylko kumulować taką niedokładność.
Jeśli więc precyzja ma znaczenie, od samego początku należy unikać wartości zmiennoprzecinkowych. Najprostsze opcje to
Na przykład, używając liczb całkowitych do przechowywania setnych, funkcja znajdowania rzeczywistej wartości jest dość prosta:
W przypadku ciągów trzeba zaokrąglać, ale nadal jest to możliwe:
Zauważ, że ta funkcja zaokrągla wartość do najbliższej, wiąże się od zera , podczas gdy IEEE 754 zaleca zaokrąglanie do najbliższej, wiąże nawet jako domyślne zachowanie dla operacji zmiennoprzecinkowych. Takie modyfikacje pozostawiają czytelnikowi ćwiczenie :)
źródło
Oto prosty
Użyj jak
alert(roundFloat(1.79209243929,4));
Jsfiddle
źródło
Zaokrąglij swoją wartość dziesiętną, a następnie użyj
toFixed(x)
dla oczekiwanych cyfr.Połączenie
parseDecimalRoundAndFixed (10.800243929,4) => 10,80 parseDecimalRoundAndFixed (10.807243929,2) => 10,81
źródło
Zaokrąglić w dół
Podsumowanie
Runda najbliższa
źródło
źródło
Oto moje 1-liniowe rozwiązanie:
Number((yourNumericValueHere).toFixed(2));
Oto co się dzieje:
1) Najpierw aplikujesz
.toFixed(2)
na liczbę, którą chcesz zaokrąglić miejsca dziesiętne. Zauważ, że to przekształci wartość na ciąg z liczby. Więc jeśli używasz Typescript, wygeneruje następujący błąd:„Ciąg„ Type ”nie może być przypisany do„ number ””
2) Aby odzyskać wartość liczbową lub przekonwertować ciąg na wartość liczbową, po prostu zastosuj
Number()
funkcję na tej tak zwanej wartości „ciąg”.Aby uzyskać wyjaśnienie, spójrz na poniższy przykład:
PRZYKŁAD: Mam kwotę, która ma do 5 cyfr po przecinku i chciałbym ją skrócić do 2 miejsc po przecinku. Robię to tak:
źródło
Umieść następujące w pewnym globalnym zakresie:
a następnie spróbuj :
Aktualizacja
Zauważ, że
toFixed()
może działać tylko dla liczby miejsc po przecinku,0-20
tzn.a.getDecimals(25)
Może generować błąd javascript, więc aby się dostosować, możesz dodać dodatkowe sprawdzenie, tj.źródło
spowoduje to zwrócenie losowej liczby od 1 do 100 w zaokrągleniu do 2 miejsc po przecinku.
źródło
To działało dla mnie: zaokrąglanie miejsc po przecinku w JavaScript
źródło
Korzystanie z tej odpowiedzi przez odniesienie: https://stackoverflow.com/a/21029698/454827
Buduję funkcję, aby uzyskać dynamiczne liczby dziesiętne:
tutaj działa przykład: https://jsfiddle.net/wpxLduLc/
źródło
źródło
W tych przykładach nadal będzie występować błąd przy próbie zaokrąglenia liczby 1.005 rozwiązaniem jest albo użycie biblioteki takiej jak Math.js lub tej funkcji:
źródło
Kilka miesięcy temu otrzymałem kilka pomysłów z tego postu, ale żadna z odpowiedzi tutaj ani odpowiedzi z innych postów / blogów nie poradziłyby sobie ze wszystkimi scenariuszami (np. Liczby ujemne i niektóre „szczęśliwe liczby”, które nasz tester znalazł). W końcu nasz tester nie znalazł żadnego problemu z tą metodą poniżej. Wklejanie fragmentu mojego kodu:
Mam także komentarze do kodu (przepraszam, zapomniałem już o wszystkich szczegółach) ... Publikuję tutaj swoją odpowiedź w celu późniejszego wykorzystania:
źródło
Naprawiam problem modyfikatora. Obsługuje tylko 2 miejsca dziesiętne.
źródło
To powinno dać:
10.20
To powinno dać:
0.05
To powinno dać:
4.04
itp.
źródło
źródło
Jest to bardzo proste i działa tak samo dobrze, jak inne:
Ponieważ toFixed () można wywoływać tylko na liczbach i, niestety, zwraca ciąg znaków, wykonuje to całą analizę w obu kierunkach. Możesz przekazać ciąg lub liczbę, a za każdym razem otrzymasz numer! Wywołanie parseNumber (1.49) da ci 1, a parseNumber (1.49,2) da ci 1.50. Tak jak najlepsi z nich!
źródło
Możesz także użyć
.toPrecision()
metody i kodu niestandardowego i zawsze zaokrąglać w górę do n-tej cyfry dziesiętnej bez względu na długość części int.Możesz także uczynić go wtyczką dla lepszego wykorzystania.
źródło
Proste jak to.
źródło
Znalazłem bardzo prosty sposób, który rozwiązał dla mnie ten problem i można go użyć lub dostosować:
źródło
100% działa !!! Spróbuj
źródło