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ś?


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


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);

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

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))

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.


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.


1

użyj poniższego kodu.

alert(+(Math.round(number + "e+2")  + "e-2"));

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;
}

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.