Próbuję wyświetlić liczbę jako procent za pomocą _.round
a następnie przez pomnożenie liczby przez 100. Z jakiegoś powodu, gdy pomnożę liczbę zaokrągloną, precyzja zostaje pomieszana. Oto jak to wygląda:
var num = 0.056789,
roundingPrecision = 4,
roundedNum = _.round(num, roundingPrecision),
percent = (roundedNum * 100) + "%";
console.log(roundedNum); // 0.0568
console.log(percent); // 5.680000000000001%
Dlaczego 0,00000000000000 dodano do liczby po pomnożeniu przez 100?
Odpowiedzi:
7 dla odpowiedzi № 1Wynika to z faktu, że liczby są reprezentowane wewnętrznie jako liczby binarne z ograniczoną precyzją.
Zobacz też "Czy matematyka zmiennoprzecinkowa jest zepsuta?"
Czy matematyka zmiennoprzecinkowa jest zepsuta?
0,1 + 0,2 == 0,3 -> false
0,1 + 0,2 -> 0,30000000000000004
Jakieś pomysły, dlaczego tak się dzieje?
Który dostał odpowiedź:
Dwójkowy zmiennoprzecinkowy matematyka jest taka. W większości języków programowania jest oparty na Standard IEEE 754. JavaScript wykorzystuje 64-bitową reprezentację zmiennoprzecinkową, która jest taka sama jak Java
double
. Istotą problemu jest to, że liczby są przedstawiane w tym formacie jako liczba całkowita razy większa niż potęga dwóch; liczby wymierne (np0.1
, który jest1/10
), którego mianownik nie jest potęgą dwojga, nie może być dokładnie odwzorowany.
Aby uzyskać prawidłowy wynik w twoim przypadku, musisz zaokrąglić rundę po cała arytmetyka:
var num = 0.056789,
roundingPrecision = 4,
roundedNum = _.round(num * 100, roundingPrecision),
percent = roundedNum + "%";
console.log(percent); // 5.0569%
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>