Как работать с точными числами в js, decamal?

JavaScript поддерживает только один тип чисел, называемый "числа с плавающей запятой" (оно же десятичные числа). В языке нет отдельного типа данных "точное число" или "десятичное число". Вместо этого, числа с плавающей запятой реализованы с использованием стандарта двоичного численного формата с плавающей запятой (IEEE 754).

Этот стандарт позволяет представлять и хранить числа с различными десятичными значениями, но он также вносит некоторую неточность при работе с числами, что может привести к некоторым проблемам в некоторых ситуациях.

Например, следующий код покажет проблему с неточностью при работе со сравнением десятичных чисел:

var a = 0.1;
var b = 0.2;
var sum = a + b;

console.log(sum); // Выводит 0.30000000000000004

if (sum === 0.3) {
    console.log("Число верное!");
} else {
    console.log("Число неточное!");
}

В данном случае вывод будет "Число неточное!", поскольку неточность представления чисел с плавающей запятой приводит к тому, что сумма 0.1 и 0.2 не равна 0.3.

Чтобы избежать подобных проблем, в JavaScript можно использовать фиксированную точность чисел, для этого можно использовать библиотеки или встроенные объекты, такие как BigInt, Decimal.js или BigDecimal.

// Пример использования библиотеки Decimal.js

var Decimal = require('decimal.js');
Decimal.set({ precision: 20 });

var a = new Decimal('0.1');
var b = new Decimal('0.2');
var sum = a.plus(b);

console.log(sum.toString()); // Выводит "0.3"

if (sum.toString() === '0.3') {
    console.log("Число верное!");
} else {
    console.log("Число неточное!");
}

В этом примере мы использовали библиотеку Decimal.js, чтобы работать с числами с фиксированной точностью. Код выведет "Число верное!", поскольку Decimal.js предоставляет более точное представление чисел, которое позволяет избежать неточности с обычными числами с плавающей запятой.

Надеюсь, это поможет вам понять, как работать с числами с плавающей запятой и как избегать проблем с неточностью.