@Nadoedalo

Компьютерная неточность JS

Есть проблема - иногда клиентам не добавляет копейку.
Например при попытке умножить 299 на 8.655 (доллары и курс) получается 2587.845 . Что бы правильно округлить используется Math.round(x * 100)/100. Проблема возникает тогда, когда умножаешь 2587.845 на 100, получается 258784.49999999997, что при округлении даёт 2587.84.

Посоветуйте пожалуйста каким способом вы решаете эти проблемы? Какая нибудь математическая либа, которая относится к числам как к строкам? mathjs не помогает.
Текущее решение - перенести важные вычисления на более точный бэкэнд.

Код для примера
var x = 299 * 8.655;
console.log(x, Math.round(x * 100)/100, x * 100)
>>> 2587.845, 2587.84, 258784.49999999997
  • Вопрос задан
  • 2931 просмотр
Решения вопроса 1
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
alert(Math.round((2587.845 * 100).toFixed(1))/100)
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
nekipelov
@nekipelov
Используйте целые числа. 1 рубль и 10 копеек представляются в виде 110 или 1100 в зависимости от требуемой точности.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Math.round(299*8655/10)/100
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Вариант эмуляции типа Decimal через расчеты в тысячных долях рубля и округление на каждом этапе.
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
ну и да - ыв вашем коде у меня в firebug получается верно:

var x = 2587.845*100;
x = Math.round(100*x)/100
console.log(x);

>>> var x = 2587.845*100; x = Math.round(100*x)/100 console.log(x);

258784.5
ищите, где ошибка внимательнее.
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
Нашел замечательную библиотеку:
https://github.com/guipn/sinful.js/wiki/API#math

С ее помощью будет так:
Math.div(Math.mul(100,x), 100)
Ответ написан
Комментировать
iproger
@iproger
Безответственный гений
Иногда клиентам не добавляет копейку.

Так добавляйте всегда)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы