#javascript
#javascript
Вопрос:
Я пытаюсь конвертировать 3,77 доллара США в центы следующим образом:
const number = "3.77"
const separe = number.replace(".", "")
Это правильный способ конвертировать доллары в центы? поскольку я видел несколько отчетов с другим кодом, а не какой из них правильный, есть идеи?
Комментарии:
1.
const separe = Number(number) ? Number(number * 100).
2. Ваш тоже правильный.
3. Зависит от ожидаемого форматирования. Скажем, у меня было
0.02
, захотят ли они002
? Или это должно быть2
?4. да, это должно быть 002, и если это целое значение, каким оно должно быть? например, 7 долларов
5. Доллар США равен 100 центам США. Используйте эти знания, чтобы преобразовать количество долларов в количество центов.
Ответ №1:
Будьте осторожны при выполнении арифметических вычислений в JavaScript. Особенно, если вы имеете дело с плавающей запятой.
Рассмотрим этот случай:
19.99 * 100 // 1998.9999999999998
19.99 * 100 // 1998.9999999999998
parseFloat(19.99) * 100 // 1998.9999999999998
Я знаю, верно?! Итак, я создал этот простой помощник, чтобы помочь вам:
const toCent = amount => {
const str = amount.toString()
const [int] = str.split('.')
return Number(amount.toFixed(2).replace('.', '').padEnd(int.length === 1 ? 3 : 4, '0'))
}
Результат:
toCent(19.99) // 1999
toCent(19.9) // 1990
toCent(1.9) // 190
toCent(1999.99) // 199999
Я еще не тестировал это досконально. Пожалуйста, не копируйте и не вставляйте мое решение, по крайней мере, вы делаете свой собственный тест.
Комментарии:
1. есть небольшая ошибка —
const int = str.split('.')
вместоconst [int] = str.split('.')
2. Наконец, ответ, который учитывает арифметику с плавающей запятой IEEE. Спасибо
Ответ №2:
То, как вы делаете это сейчас, совершенно справедливо. Я сравнил ваш ответ с ответами из комментариев, и вот результаты.
Победитель:
const result = (parseFloat(number) * 100).toString();
Второе место (~ 99% победителей):
const result = (Number(number) * 100).toString();
Третье место (~ 96% победителей):
const result = ( number * 100).toString();
Четвертое место (~ 80% победителей):
const result = number.replace(".", "");
Как уже отмечалось, ваш метод не будет работать, если строка не совпадает /d.dd/
однако другие методы будут работать.
Протестировано на Safari 14
Ответ №3:
Это сделает это с любым значением.
export function toCents(aValue){
return Math.round((Math.abs(aValue) / 100) * 10000);
}
Комментарии:
1.
toCents(17.49) // 1748
2. @OrionHall только что обновил функцию.
Ответ №4:
Math.round(x * 100)
кажется довольно безопасным, потому что он округляется до ближайшего целого числа. Лучшие варианты:
- Всегда представляйте свои суммы в центах (т. Е. целых числах) и при необходимости делите на доллары
- Используйте библиотеку (такую как decimal.js или Big.js )
Реализации в двух вышеупомянутых библиотеках являются сверхсложными (здесь, здесь).