В JavaScript можно принимать меры для борьбы с проблемой точности чисел с плавающей запятой. Вот некоторые из них:
- Используйте метод
toFixed()
МетодtoFixed()
возвращает строку, представляющую число с заданным количеством знаков после запятой. Например:let sum = 0.1 + 0.2; console.log(sum.toFixed(2)); // 0.30
- Используйте библиотеку
Big.js
БиблиотекаBig.js
предоставляет возможность работать с числами произвольной точности. Она поддерживает арифметические операции, функции округления и многое другое. Вы можете установить ее черезnpm
:npm install big.js
Затем вы можете использовать ее в своем коде:const Big = require('big.js'); let sum = new Big(0.1).plus(0.2); console.log(sum.toFixed(2)); // 0.30
- Избегайте сравнения чисел на равенство Из-за проблемы точности сравнение двух чисел на равенство может дать неправильный результат. Вместо этого вы можете сравнивать числа с помощью допустимой погрешности:
let sum = 0.1 + 0.2; if (Math.abs(sum - 0.3) < 0.0001) { console.log('sum is equal to 0.3'); }
- Используйте
BigInt
В JavaScript есть тип данныхBigInt
, который может представлять числа с большей точностью. Однако этот тип данных не поддерживаются во всех браузерах и окружениях JavaScript, поэтому его использование может быть ограничено. - Используйте
decimal.js
В JavaScript нет встроенного типа данных Decimal. Однако, существуют сторонние библиотеки, которые предоставляют такой функционал, например, библиотекаdecimal.js
. Эта библиотека реализует объектDecimal
, который позволяет работать с десятичными числами с высокой точностью и предоставляет множество математических операций, таких как сложение, вычитание, умножение, деление, возведение в степень, извлечение корня, а также операции сравнения и округления. В отличие от встроенных чисел JavaScript, объектыDecimal
могут хранить десятичные значения с высокой точностью и без потерь, что делает их полезными в приложениях, где требуется точный расчёт с десятичными числами.
Вот несколько полезных ссылок на тему:
- Basic math in JavaScript — numbers and operators: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math#Floating_point_numbers
- JavaScript has a floating-point problem: https://medium.com/@robftz/javascript-has-a-floating-point-problem-heres-a-fix-3d433969e37e
- Документация библиотеки Big.js: https://github.com/MikeMcl/big.js/
- Документация библиотеки Decimal.js: https://github.com/MikeMcl/decimal.js/
- Why You Shouldn’t Round Numbers with JavaScript’s Math.round(): https://css-tricks.com/why-you-shouldnt-round-numbers-with-javascripts-math-round/
- JavaScript numbers are weird: https://2ality.com/2012/04/number-encoding.html