Как корректно работать с денежными значениями в JavaScript

dc2fcb8d cd1e 436e 9f7c cedc339df34b 1 HTML

Работа с денежными значениями в программировании часто сопровождается трудностями, связанными с представлением чисел с плавающей запятой. Эти проблемы проявляются, когда мы пытаемся выполнять операции умножения и деления. Если у вас есть сомнения, попробуйте ввести в консоли 10/3 или 3.3*3 и обратите внимание на полученный результат. В большинстве случаев, для работы с денежными значениями нам требуется два знака после запятой, но когда дело касается трейдинга или криптовалют, точность может достигать четырёх, шести, восьми и более знаков.

Решение проблемы с плавающей запятой

Одна из возможностей корректного выполнения операций с денежными значениями — это преобразование числа с плавающей запятой в целое, временно убирая запятую. Например, вместо того, чтобы умножать 3.3 на 3, мы можем умножить 33 на 3 и затем разделить результат на 10. Вот пример такой реализации:

const multiplyMoney = (amount, multiplyBy, significantDecimals = 2) => {
const precision = Math.pow(10, significantDecimals);
const wholeAmount = amount * precision;
const result = Math.floor(wholeAmount * multiplyBy);
return result / precision;
};

Для деления также можно использовать схожий подход:

const divideMoney = (amount, divideBy, significantDecimals = 2) => {
const precision = Math.pow(10, significantDecimals);
const result = multiplyMoney(amount, 1 / divideBy, significantDecimals);
const remainder = ((amount * precision) % (result * precision)) / precision;
return [result, remainder];
};

Примеры использования:

console.log(3.111 * 2.1); // 6.533100000000001
console.log(multiplyMoney(3.111, 2.1, 6)); // 6.5331
console.log(multiplyMoney(3.111, 2.1)); // 6.53
console.log(10 / 3); // 3.3333333333333335
console.log(divideMoney(10, 3)); // [ 3.33, 0.01 ]
console.log(divideMoney(10, 3, 0)); // [ 3, 1 ]
console.log(divideMoney(10, 3, 1)); // [ 3.3, 0.1 ]

Правильное форматирование денежных значений

С развитием веб-технологий, необходимость самостоятельно добавлять символ валюты к числу ушла в прошлое. Для этого существует встроенный в JavaScript API Intl.NumberFormat, который позволяет форматировать числа в зависимости от локали и выбранной валюты. Локаль определяет, как будет представлено число, в том числе какие символы будут использоваться для разделения тысяч и десятичных знаков.

Примеры использования:

let number = 1000000.5;
let options = { style: 'currency', currency: 'USD' };

console.log(new Intl.NumberFormat('en-US', options).format(number)); // $1,000,000.50
console.log(new Intl.NumberFormat('in-IN', options).format(number)); // ₹1,00,00,000.50
console.log(new Intl.NumberFormat('ru-RU', options).format(number)); // 1 000 000,50 ₽

Если необходимо изменить валюту, достаточно задать новый параметр:

options = { style: 'currency', currency: 'EUR' };

console.log(new Intl.NumberFormat('en-US', options).format(number)); // €1,000,000.50
console.log(new Intl.NumberFormat('in-IN', options).format(number)); // €1.000.000,50
console.log(new Intl.NumberFormat('ru-RU', options).format(number)); // 1 000 000,50 €

Заключение

Использование API Intl.NumberFormat имеет несколько преимуществ, включая встроенную поддержку браузеров и возможность адаптации форматов чисел под различные локали. Это делает его не только удобным, но и перспективным инструментом для работы с денежными значениями в JavaScript. Включение этого функционала в ваш код гарантирует, что он будет корректно работать с валютами по всему миру, поддерживая современные стандарты веб-разработки.

Оцените статью