/ / Precyzja zaokrąglania Lodasha - javascript, zaokrąglenie, procent, lodash, precyzja zmiennoprzecinkowa

Dokładność zaokrąglania Lodasha - javascript, zaokrąglenie, procent, lodash, precyzja zmiennoprzecinkowa

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%

skrzypce

Dlaczego 0,00000000000000 dodano do liczby po pomnożeniu przez 100?

Odpowiedzi:

7 dla odpowiedzi № 1

Wynika 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 (np 0.1, który jest 1/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>