10/3
3.3*3
Решение проблемы с плавающей запятой
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 ]
Правильное форматирование денежных значений
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 €
Заключение
Intl.NumberFormat