Załóżmy, że mam wartość 15.7784514, chcę wyświetlić ją 15,77 bez zaokrąglania.
var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));
Prowadzi do -
15.8
15.78
15.778
15.7784514000
Jak wyświetlić 15,77?
javascript
tempid
źródło
źródło
Odpowiedzi:
Konwertuj liczbę na ciąg znaków, dopasuj liczbę do drugiego miejsca po przecinku:
W
toFixed
niektórych przypadkach metoda ta zawiedzietoString
, więc bądź bardzo ostrożny.źródło
toFixed
, choć tak:(Math.floor(value * 100) / 100).toFixed(2)
. Jak zapewne wiesz, dziwne precyzyjne rzeczy mogą się zdarzyć z wartościami zmiennoprzecinkowymi (a po drugiej stronie spektrum, jeśli liczba się zdarzy15
, brzmi tak, jak chce OP15.00
).Number((15.7784514000*100).toString().match(/^\d+/)/100);
Aktualizacja 5 listopada 2016 r
Nowa odpowiedź, zawsze dokładna
Ponieważ matematyka zmiennoprzecinkowa w javascript zawsze będzie miała przypadki krawędzi, poprzednie rozwiązanie będzie przez większość czasu dokładne, co nie jest wystarczająco dobre. Istnieje kilka rozwiązań tego typu
num.toPrecision
, takich jak BigDecimal.js i rachunkowości.js . Uważam jednak, że samo parsowanie łańcucha będzie najprostsze i zawsze dokładne.Opierając aktualizację na dobrze napisanym wyrażeniu regularnym z zaakceptowanej odpowiedzi @Gumbo, ta nowa funkcja toFixed zawsze będzie działać zgodnie z oczekiwaniami.
Stara odpowiedź, nie zawsze dokładna.
Rzuć własną funkcję toFixed:
źródło
toFixed(0.0000000052, 2)
daje „5,2”. Można to naprawić za pomocąreturn num.toFixed(fixed+1).match(re)[0];
Zawiadomienia Używam toFixed z jednym miejscem dziesiętnym nad celem, aby uniknąć zaokrąglania, a następnie uruchamiając dopasowanie wyrażenia regularnegoZdecydowałem się napisać to zamiast tego, aby ręcznie usunąć resztę za pomocą ciągów, aby nie musieć zajmować się matematyką związaną z liczbami:
To da ci „15,77” z num = 15,7784514;
źródło
Październik 2017 r
Ogólne rozwiązanie w celu obcięcia (bez zaokrąglania) liczby do n-tej cyfry dziesiętnej i przekształcenia jej w ciąg o dokładnie n cyfr dziesiętnych dla dowolnego n ≥0.
gdzie x może być liczbą (która jest konwertowana na ciąg) lub ciągiem.
Oto kilka testów dla n = 2 (włączając ten wymagany przez OP):
* Jak wspomniano w notatce, wynika to z domyślnej konwersji javascript na wykładniczą dla „1.99e-7” i dla niektórych innych wartości n:
źródło
toFixedTrunc(0.000000199, 2) // 1.99
parseInt jest szybszy niż Math.floor
źródło
Zwróci 19,66
źródło
Po prostu zrób to
źródło
Te rozwiązania działają, ale dla mnie wydają się niepotrzebnie skomplikowane. Osobiście lubię używać operatora modułu, aby uzyskać pozostałą część operacji dzielenia, i usunąć ją. Zakładając, że num = 15,7784514:
Jest to równoważne z wypowiedzeniem num = num - (num% .01).
źródło
Odpowiedzi tutaj nie pomogły mi, zaokrąglały się w górę lub podawały niewłaściwy ułamek dziesiętny.
moje rozwiązanie konwertuje liczbę dziesiętną na ciąg, wyodrębnia znaki, a następnie zwraca całość jako liczbę.
źródło
Moja wersja na liczby dodatnie:
Szybki, ładny, oczywisty. (wersja na liczby dodatnie)
źródło
-0.7752
. Sprawdź, czytoFixed_norounding(-0.7752,2)
powraca-0.78
zamiast-0.77
Poniższy kod działa dla mnie bardzo dobrze:
źródło
-?
;)Naprawiłem za pomocą następującego prostego sposobu-
Wyniki będą 15.77
źródło
-15.7784514
zwraca-15.78
Po prostu skróć cyfry:
źródło
Inne rozwiązanie jednowierszowe:
Użyłem 100, ponieważ chcesz skrócić do drugiej cyfry, ale bardziej elastycznym rozwiązaniem byłoby:
gdzie cyfry to liczba cyfr dziesiętnych do zachowania.
Zobacz specyfikacje Math.trunc, aby uzyskać szczegółowe informacje i zgodność przeglądarki.
źródło
Tu masz. Odpowiedź, która pokazuje jeszcze inny sposób rozwiązania problemu:
Zwróć uwagę na użycie znaku + przed końcowym wyrażeniem. Oznacza to konwersję naszego obciętego, pokrojonego łańcucha z powrotem na typ liczbowy.
Mam nadzieję, że to pomoże!
źródło
obcinaj bez zer
lub
test:
obciąć zerami
test:
źródło
To działało dla mnie dobrze. Mam nadzieję, że rozwiąże to również twoje problemy.
źródło
Łatwy sposób to zrobić, ale koniecznie upewnij się, że parametr kwota jest podany jako ciąg.
}
źródło
źródło
Kiedyś
(num-0.05).toFixed(1)
dostawałem drugiego miejsca po przecinku.źródło
Moje rozwiązanie w maszynopisie (może być łatwo przeniesione do JS):
Przypadki testowe:
Jakieś ulepszenia?
źródło
Rzuć własną
toFixed
funkcję: dla wartości dodatnichMath.floor
działa dobrze.Dla wartości ujemnych
Math.floor
jest to runda wartości. Możesz więc użyćMath.ceil
zamiast tego.Przykład,
źródło
Drugie rozwiązanie Gumbo, z wyrażeniem regularnym, działa, ale jest powolne z powodu wyrażenia regularnego. Pierwsze rozwiązanie Gumbo zawodzi w niektórych sytuacjach z powodu niedokładności liczb zmiennoprzecinkowych. Zobacz JSFiddle aby zobaczyć demonstrację i test porównawczy. Drugie rozwiązanie zajmuje około 1636 nanosekund na połączenie w moim obecnym systemie, procesor Intel Core i5-2500 przy 3,30 GHz.
Rozwiązanie, które napisałem, polega na dodaniu niewielkiej kompensacji w celu wyeliminowania niedokładności zmiennoprzecinkowej. Jest to w zasadzie natychmiastowe, tj. Rzędu nanosekund. Taktowałem 2 nanosekundy na każde połączenie, ale liczniki JavaScript nie są bardzo precyzyjne ani szczegółowe. Oto skrzypce JS i kod.
źródło
Opierając się na Davida D's odpowiedzi:
źródło
Bardziej niezawodne jest uzyskanie dwóch punktów zmiennoprzecinkowych bez zaokrąglania.
Referencyjna odpowiedź
Dziękuję Ci !
źródło
Już istnieje odpowiednia odpowiedź z wyrażeniem regularnym i obliczeniami arytmetycznymi, możesz także spróbować tego
źródło
Oto, co zrobiono z łańcuchem
źródło
Wszystkie te odpowiedzi wydają się nieco skomplikowane. Chciałbym odjąć 0,5 od twojego numeru i użyć toFixed ().
źródło
Najbardziej wydajnym rozwiązaniem (dla 2 cyfr ułamkowych) jest odjęcie 0,005 przed wywołaniem
toFixed()
Liczby ujemne również zostaną zaokrąglone w dół (od zera). OP nie powiedział nic o liczbach ujemnych.
źródło
Wiem, że istnieje już kilka działających przykładów, ale myślę, że warto zaproponować mój odpowiednik String.toFixed, niektórzy mogą uznać to za pomocne.
To moja alternatywa dla toFixed, która nie zaokrągla liczb, po prostu ją obciąża lub dodaje zera zgodnie z podaną precyzją. W przypadku bardzo długiej liczby używa wbudowanego zaokrąglania JS, gdy precyzja jest za długa. Funkcja działa dla wszystkich problematycznych liczb, które znalazłem na stosie.
Pamiętaj, że precyzja może nie być właściwie obsługiwana dla liczb o długości 18 i większej, np. 64-bitowy Chrome zaokrągli ją lub doda „e +” / „e-”, aby utrzymać liczbę na 18.
Jeśli chcesz wykonywać operacje na liczbach rzeczywistych, bezpieczniej jest pomnożyć go przez
Math.sqrt(10, precision)
pierwsze, wykonać obliczenia, a następnie zanotować wynik według wartości mnożnika.Przykład:
Dlatego tak ważne jest, aby używać takiego mnożnika / dzielnika, gdy mamy do czynienia z liczbami rzeczywistymi w javascript, szczególnie przy obliczaniu pieniędzy ...
źródło