Zaokrąglanie liczb do 2 cyfr po przecinku

83

Nie mam pojęcia, jak to zrobić? Dodam liczby przecinkami, wynik jest oczywiście zawsze liczbą ze zdecydowanie zbyt dużą liczbą cyfr po przecinku. ktoś?

Sten Van den Bergh
źródło
1
W przypadku niektórych języków przecinki są zastępowane kropkami.
DOK
@Matt - jest to część wtyczki jParseFloat, będzie częścią rdzenia jQuery w wersji 1.5!
Nick Craver

Odpowiedzi:

107

EDYCJA 2 :

Użyj metody Numberobiektu w następujący toFixedsposób:

var num = Number(0.005) // The Number() only visualizes the type and is not needed
var roundedString = num.toFixed(2);
var rounded = Number(roudedString); // toFixed() returns a string (often suitable for printing already)

Zaokrągla 42,0054321 do 42,01

Zaokrągla od 0,005 do 0,01

Zaokrągla od -0,005 do -0,01 (więc wartość bezwzględna rośnie wraz z zaokrągleniem do granicy 0,5)

Przykład jsFiddle

Jacob Relkin
źródło
1
@Sten - przecinek czy dziesiętny? Twoje pytanie i przykład nie zgadzają się.
Nick Craver
11
Ten przykład nie działa, jeśli chcesz zaokrąglić liczbę, powiedzmy od 0,007 do dwóch miejsc po przecinku. Wynikiem tego jest: Math.round (0,007) -> 0,000, a następnie toFixed (2) -> 0,00. Faktyczny proces zaokrąglania powinien dawać 0,01.
Andrei
9
downvote: odpowiedź jest niepoprawna, ponieważ Math.round () zaokrągla liczbę, usuwając w ten sposób wszystkie miejsca po przecinku. Wszystko to następnie robi toFixed (2), to dodaje dwa końcowe zera. Wystarczy number.toFixed (2).
HammerNL
1
Coś należy zrobić, ponieważ ta odpowiedź jest błędna i inne osoby mogą nie przeczytać komentarzy przed użyciem na ślepo zaakceptowanej odpowiedzi.
Pedro Moreira,
1
−1: 3.1415staje się 3.00w twoim przykładzie.
102

AKTUALIZACJA: Należy pamiętać, że w momencie, gdy odpowiedź została napisana po raz pierwszy w 2010 r., Funkcja poniżej toFixed () działała nieco inaczej. ToFixed () wydaje się teraz dokonywać pewnych zaokrągleń, ale nie w ściśle matematyczny sposób. Więc uważaj na to. Wykonaj swoje testy ... Metoda opisana poniżej sprawdzi się dobrze, zgodnie z oczekiwaniami matematyka.

  • toFixed()- metoda konwertuje liczbę na łańcuch, zachowując określoną liczbę miejsc po przecinku. W rzeczywistości nie zaokrągla liczby w górę, lecz ją obcina.
  • Math.round(n)- zaokrągla liczbę do najbliższej liczby całkowitej. Tak więc obracając:

0,5 -> 1; 0,05 -> 0

więc jeśli chcesz zaokrąglić, powiedz liczbę 0,55555, tylko do drugiego miejsca po przecinku; możesz wykonać następujące czynności (jest to koncepcja krok po kroku):

  • 0.55555 * 100 = 55,555
  • Math.Round(55.555) -> 56.000
  • 56.000 / 100 = 0,56000
  • (0.56000).toFixed(2) -> 0,56

a to jest kod:

(Math.round(number * 100)/100).toFixed(2);
Andrei
źródło
Używam tej samej metody. Działa świetnie
Indiana Kernick
Powoduje problemy w przykładach, gdy masz już zmiennoprzecinkowe z żądanymi cyframi po przecinku, takie jak> (Math.round (123.12124 * 100) / 100) .toFixed (4); ===> 123,1200
Alendorff
1
Zapomniałeś zmienić matematykę zaokrągleń, na przykład: Math.round (123.12124 * 10000) / 10000) .toFixed (4). Dzieje się tak, jeśli chcesz zaokrąglić do czwartego miejsca po przecinku.
Andrei,
Błąd: toFixed () robi okrągłe liczby, więc nie jest obcięcie. Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
MikeB
Nie pasuje do 1.005
Len Joseph,
55

To zadziałało dla mnie:

var new_number = float.toFixed(2);

Przykład:

var my_float = 0.6666

my_float.toFixed(3) # => 0.667
Raivo
źródło
Myślę, że problem z tym polega na tym, że nie „zaokrągla” liczby, więc 0.6666.toFixed(3)staje się 0.666zamiast 0.667. @Andrei wydaje się mieć właściwe rozwiązanie do prawidłowego zaokrąglania.
Joshua Pinter,
1
Ha! Nieważne. Właśnie testowałem to i toFixed()działa perfekcyjnie: 0.6666.toFixed(3) # => 0.667. Dodam to do twojej odpowiedzi.
Joshua Pinter,
3
Najkrótszy i najlepszy. To powinna być akceptowana odpowiedź.
12

Poprzednie odpowiedzi zapomniały ponownie wpisać dane wyjściowe jako liczbę. W zależności od upodobań można to zrobić na kilka sposobów.

+my_float.toFixed(2)

Number(my_float.toFixed(2))

parseFloat(my_float.toFixed(2))
Romain Vergnory
źródło
1
To według mnie najlepsza odpowiedź. Jest prosty, krótki, a jego wynikiem jest NUMBER
Kar.ma
Podoba mi się notacja „+”, bardzo elegancka
Jibeee,
5

To nie jest naprawdę przyjazne dla procesora, ale:

Math.round(number*100)/100

działa zgodnie z oczekiwaniami.

Tu4n3r
źródło
2

Chociaż mamy tutaj wiele odpowiedzi z wieloma przydatnymi sugestiami, w każdej z nich nadal brakuje pewnych kroków.
Oto kompletne rozwiązanie opakowane w małą funkcję:

function roundToTwoDigitsAfterComma(floatNumber) {
    return parseFloat((Math.round(floatNumber * 100) / 100).toFixed(2));
}

Na wypadek gdybyś był zainteresowany, jak to działa:

  1. Wielokrotne przez 100, a następnie zaokrąglaj, aby zachować dokładność 2 cyfr po przecinku
  2. Podziel z powrotem na 100 i użyj, toFixed(2)aby zachować 2 cyfry po przecinku i wrzucić inną bezużyteczną część
  3. Konwertuj go z powrotem na zmiennoprzecinkowy, używając zamiast tego parseFloat()funkcji jako toFixed(2)zwracanego ciągu

Uwaga: jeśli zachowujesz ostatnie 2 cyfry po przecinku, ponieważ pracujesz z wartościami pieniężnymi i wykonujesz obliczenia finansowe, pamiętaj, że to nie jest dobry pomysł i lepiej zamiast tego użyj wartości całkowitych.

Just Shadow
źródło
1

użyj poniższego kodu.

alert(+(Math.round(number + "e+2")  + "e-2"));
Feniks
źródło
2
Ta odpowiedź zasadniczo robi to samo, co inne odpowiedzi na to 7-letnie pytanie, ale w bardzo niejasny sposób, wykorzystując niejawne konwersje typów języka JavaScript. Jakie cechy tego kodu przekonały Cię do umieszczenia go tutaj?
u354356007
Jakość tej odpowiedzi polega na tym, że nauczyłem się czegoś nowego, czego nie wiedziałem o JS ;-)
Deblaton Jean-Philippe
0

Używam tego:

function round(value, precision) {

	if(precision == 0)
		return Math.round(value);  	

	exp = 1;
	for(i=0;i<precision;i++)
		exp *= 10;

	return Math.round(value*exp)/exp;
}

Gehtdich Nichtsan
źródło