Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Округление только при маленькой погрешности

#javascript #jquery #числа_с_плавающей_точкой


В консоли при делении 0.051 / 0.017 получается 2.9999999999999996 (хотя обычные калькуляторы
показывают правильно "3"). Подскажите, пожалуйста, как сделать что-бы в js получалось
также как и на калькуляторе? Т.е. так:

0.050/0.017=2.941176470588235
0.051/0.017=3
0.052/0.017=3,058823529411765

    


Ответы

Ответ 1



0.1 + 0.2 = 0.30000000000000004 это ответ js, если нужна точная математика, то следует использовать другой язык. Всё дело в том, что в стандарте IEEE 754 на число выделяется ровно 8 байт(=64 бита), не больше и не меньше. Число 0.1 (одна десятая) записывается просто в десятичном формате. Но в двоичной системе счисления это бесконечная дробь, так как единица на десять в двоичной системе так просто не делится. Также бесконечной дробью является 0.2 (=2/10). Двоичное значение бесконечных дробей хранится только до определенного знака, поэтому возникает неточность. Можно костыль сделать... (0.051 * 1000) / (0.017 * 1000) //3 ((0.1 * 10) + (0.2 * 10)) / 10 //0.3 Ну сами понимаете... ТУТ это подробнее описано.

Ответ 2



Вот так примерно: let round = v => { let r = Math.round(v); return Math.abs(r-v) < Number.EPSILON*10 ? r : v; } console.log(0.7/0.1) console.log(round(0.7/0.1)) console.log(round(0.0001))

Комментариев нет:

Отправить комментарий