Плавающая точка (float числа) IEEE-754 как пофикси?

Как избавится от проблем формата IEEE-754, который создаёт проблемы с записью числа:

4.3-3=1.2999999999999998

0.1+0.2=0.30000000000000004

Как мне избавится от этих проблем?


Ответы (2 шт):

Автор решения: rotabor

Никаких проблем нет:

  1. Для вывода результатов нужно использовать форматирование.
  2. Для сравнения использовать допустимую погрешность.
  3. Для денег использовать специальный тип.
  4. В каких-то случаях можно использовать целые числа вместо вещественных.
→ Ссылка
Автор решения: ΝNL993

Я бы лично для таких ситуаций просто использовал числа по больше, вот пример:

class CorrectFloat {
  constructor(x) {
    this.x = +x || 0
  }

  increase(y) {
    return correctFloat(((this.x * 1e3) + (y * 1e3)) / 1e3)
  }

  decrease(y) {
    return correctFloat(((this.x * 1e3) - (y * 1e3)) / 1e3)
  }

  get() {
    return this.x
  }
}

function correctFloat(n) {
  return new CorrectFloat(n)
}

console.log('0.1 + 0.2 =', correctFloat(0.1)
  .increase(0.2)
  .get()
)

console.log('4.3 - 3 =', correctFloat(4.3)
  .decrease(3)
  .get()
)

Конечно с такими числами могут возникнуть проблемы, для примера, если число будет слишком большим, то тогда оно (число) не измениться вообще, но для таких ситуаций можно использовать BigInt, нужно будет создавать отдельный класс и функцию под это. Но если работать с не большими числами то всё будет работать вполне нормально. (Ну и где по меньше чисел после запятой :), в смысле после точки)

→ Ссылка