-1

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

4.3-3=1.2999999999999998

0.1+0.2=0.30000000000000004

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

  • 2
    А в чём, собственно, проблема? Для вывода результатов нужно использовать форматирование, для сравнения использовать допустимую погрешность. В каких-то случаях можно использовать целые числа вместо вещественных. – rotabor Jan 04 '23 at 08:45
  • Возможный дубликат вопроса: Сумма чисел с плавающей точкой – Nowhere Man Jan 17 '23 at 08:28

2 Answers2

2

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

  1. Для вывода результатов нужно использовать форматирование.
  2. Для сравнения использовать допустимую погрешность.
  3. Для денег использовать специальный тип.
  4. В каких-то случаях можно использовать целые числа вместо вещественных.
rotabor
  • 4,251
-1

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

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, нужно будет создавать отдельный класс и функцию под это. Но если работать с не большими числами то всё будет работать вполне нормально. (Ну и где по меньше чисел после запятой :), в смысле после точки)

ΝNL993
  • 3,453