3

В консоли при делении 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
Kromster
  • 13,809
g4343
  • 231
  • @Kromster, такой метки почти не существует в SO, зачем лепить её? – De.Minov May 21 '19 at 12:41
  • @CbIPoK2513 а как по вашему новые метки появляются и множатся? Вопрос именно по этой теме. Сейчас еще по вопросам пройдусь, добавлю ее. И наверняка этот вопрос как дубликат можно будет закрыть или указать синонимы. – Kromster May 21 '19 at 12:41
  • https://jsfiddle.net/OPTlMUS/eh04afus/ - смотрите еще сюда) Тоже странные вещи)) Именно с 0.3 и 0.7... – OPTIMUS PRIME May 21 '19 at 12:42
  • И кстати 0.050 и 0.017 это не совсем те числа, что вы думаете, смотрите https://ru.stackoverflow.com/questions/846925 – Kromster May 21 '19 at 12:45

2 Answers2

2

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

Ну сами понимаете... ТУТ это подробнее описано.

Ruslan
  • 884
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))