JavaScript: Zaokrąglij do określonej liczby miejsc dziesiętnych, ale usuń dodatkowe zera


85

Oto scenariusz: dostaję, .9999999999999999kiedy powinienem 1.0.
Mogę sobie pozwolić na utratę miejsca dziesiętnego dokładności, więc używam .toFixed(15), który rodzaj działa.

Zaokrąglanie działa, ale problem polega na tym, że jestem podany 1.000000000000000.
Czy istnieje sposób zaokrąglić do kilku miejsc po przecinku, ale usunąć dodatkowe spacje?

Uwaga: .toPrecisionnie jest tym, czego chcę; Chcę tylko określić, ile liczb po przecinku.
Uwaga 2: nie mogę po prostu użyć, .toPrecision(1)ponieważ muszę zachować wysoką precyzję dla liczb, które faktycznie mają dane po przecinku. Idealnie byłoby, gdyby było dokładnie tyle miejsc po przecinku, ile potrzeba (do 15).


Chodzi o to, że .toFixed zwraca String, więc zwykłe wyzwolenie go za pomocą Number, a następnie z powrotem do String, spowoduje ponowne przekonwertowanie go bez końcowych zer.
Neil,

@Nathan: tylko dla wyjaśnienia. Czy chcesz po prostu usunąć końcowe zera w ciągu , który otrzymałeś za pomocą toFixed ()?
Jiri Kriz

Odpowiedzi:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
Nie zapomnij umieścić ich w nawiasach, gdy traktujesz liczby ujemne: -2.34.toFixed(1)zwraca z -2.3powodu pierwszeństwa operatora .
Константин Ван

1
Użycie jednoargumentowego operatora + powinno być szybsze niż parseFloatfunkcji: +number.toFixed(13)tego wyrażenia można również użyć do usunięcia niedokładności numerów JavaScript, takich jak 1.0000000000000045.
ygoe


19

Jak rozumiem, chcesz usunąć końcowe zera w ciągu otrzymanym za pośrednictwem toFixed(). To jest czysta operacja na łańcuchu:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
Tylko Ty naprawdę odpowiedziałeś na to pytanie… dzięki!
Mugen

4
To pozostawia kropkę na okrągłych liczbach („100,00” => „100”)
pckill

5
@pckill, jeśli nie chcesz, aby kropka została zastąpiona w wyrażeniu regularnym ( ...replace(/\.?0+$/, "");).
Zach Snow

To kończy się niepowodzeniem w przypadku 0 i -0, ponieważ 0staje się pustym łańcuchem ""i -0staje się -, z których żaden nie jest oczekiwany (przypuszczalnie). @ zach-snow Twoje sugerowane rozwiązanie również nie działa przy 0 i -0.
robocat

@Mugen, jaki był problem z odpowiedzią Gusa?
trysis

9

Number(n.toFixed(15)) or +(n.toFixed(15)) zamieni ciąg dziesiętny zawierający 15 miejsc na liczbę, usuwając końcowe zera.


1
Pomyślałem, że zwróciłbym na to uwagę, + (n.toFixed (...)) jest znacznie bardziej wydajne niż parseFloat. Nie wiem dlaczego, ale jest też bardziej wydajny niż Number w Chrome.
Domino

8

Jeśli rzutujesz wartość zwracaną na liczbę, te końcowe zera zostaną usunięte. Jest to również mniej szczegółowe niż parseFloat()jest.

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

Ten wykorzystuje operator jednoargumentowy + , więc jeśli używasz to jako część operacji strun trzeba mieć Infix + przed nim: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));. FYI jednoargumentowy + przed łańcuchem konwertuje go na liczbę. Z MDN: Unary + może:

konwertuje łańcuchowe reprezentacje liczb całkowitych i zmiennoprzecinkowych, a także wartości niebędące łańcuchami true, false i null. Obsługiwane są liczby całkowite w formacie dziesiętnym i szesnastkowym (z prefiksem „0x”). Obsługiwane są liczby ujemne (ale nie szesnastkowe). Jeśli nie może przeanalizować określonej wartości, zostanie obliczona na NaN.


@robocat Właśnie wykonałem proste sprawdzenie; +(4.1).toFixed(4)jest 4.1w Chrome 60 .
Константин Ван

Nie rozumiem. Jaki był powód, dla którego ta odpowiedź została odrzucona?
Константин Ван

@K Miałeś rację, więc usunąłem swój poprzedni komentarz i dodałem do odpowiedzi (myślę, że używałem infix + z ciągiem po lewej stronie, zamiast poprawnie używać jednoargumentowego +. Zwykle jestem bardziej ostrożny! Pozdrawiam)
robocat

Ta odpowiedź nadal działa z NaN, Infinity, -Infinity, 3e30 i 0. Niektóre inne odpowiedzi zawodzą w niektórych przypadkach narożnych.
robocat

(4) .toFixed (2) -> „4.00” w przeglądarce Chrome 60.0.3112.113
Daniel Que

1

Żadne z nich nie dało mi tego, czego szukałem na podstawie tytułu pytania, czyli na przykład 5,00 to 5, a 5,10 to 5,1. Moje rozwiązanie było następujące:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

Uwaga: wyrażenie regularne działa tylko wtedy, gdy places > 0

PS https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


Niepowodzenie 5e30(zmienia numer na 5e3). Narożne skrzynie są diaboliczne!
robocat

0

Jest lepsza metoda, która zachowuje precyzję i usuwa zera. Pobiera liczbę wejściową i za pomocą jakiejś magii rzucania wyciągnie wszystkie końcowe zera. Odkryłem, że 16 to dla mnie limit precyzji, co jest całkiem niezłe, jeśli nie umieszczasz satelity na Plutonie.

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

toFixed()Sposób formatuje numberkorzystając stałoprzecinkowych notacji i zwraca string.

Stosuje strategię zaokrąglania do połowy w górę .

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

Jak opisałeś, czasami spowoduje to również (potencjalnie niepotrzebne) zera końcowe.

(0.001).toFixed(2); // returns 0.00

Możesz nie chcieć pozbyć się tych końcowych zer, w zasadzie możesz po prostu przekonwertować je z powrotem na number. Istnieje wiele sposobów, aby to zrobić.

+(0.001).toFixed(2); // the shortest

Aby zapoznać się z przeglądem różnych metod konwersji ciągów znaków na liczby, sprawdź to pytanie, na które można znaleźć doskonałe odpowiedzi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.