Co może pójść nie tak w prostym mnożeniu? Miałem okazje przekonać się o tym, gdy próbowałem pomnożyć cenę produktu w euro przez jego ilość.
I wtedy pojawił się on… błąd precyzji typu liczbowego.
Oto historia głupiego błędu.
Na początek fragment kodu:
const a = 1.005 ;
const b = 100;
const result = a * b;
test.is.equal(result, 100.5) //result false 100.5 not equal 100.49999999999999
Ok zapomniałem, o niedokładności typów dziesiętnych w JS. Chyba wystarczy, że zaokrągle:
result = Math.round(result)
tylko że JS zaokrągli do pełnej liczby, to może
Math.round(result*10)/10
Niestety nie na każdej przeglądarce zadziała (znowu precyzja typu zmiennoprzecinkowego przesyła pozdrowienia).
Ale znalazłem obejście problemu:
(a*b).toFixed(1) // zwróci "100.5" trzeba tylko rzutować na typ numeryczny: +(a*b).toFixed(1) //zwróci 100.5 bingo!
całość zmagań tutaj:
https://codepen.io/dodekx/pen/XZaLQy?editors=0011
One thought on “JS problemy z zaokrągleniem”