Конвертируйте доллары в центы в JavaScript

#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) кажется довольно безопасным, потому что он округляется до ближайшего целого числа. Лучшие варианты:

  1. Всегда представляйте свои суммы в центах (т. Е. целых числах) и при необходимости делите на доллары
  2. Используйте библиотеку (такую как decimal.js или Big.js )

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