Валютные операции с javaScript?
Я создаю бюджетное приложение с помощью JavaScript. Я должен позволить javascript выполнять большинство операций. Таким образом, у меня есть некоторые элементы управления, где пользователь изменяет желаемую сумму для категории, и мое приложение показывает новые суммы для подкатегорий. Так что, если у меня + Авто $50,23 - Газ $30,25 - Техническое обслуживание $6,27 - Страховка $10,02 - ...
Таким образом, если пользователь изменит Auto 50.23 на 90.00, суммы на газ, обслуживание, страховку и т. Д. Будут отражать увеличение в% в их родительской категории.
Проблема в том, что после нескольких операций я теряю точность, и это создает некоторые неприятные ошибки. В большинстве случаев цифры не складываются (как они должны). После изменения суммы для auto несколько раз, а затем установки ее на 0, другие суммы не всегда становятся равными 0, и иногда они опускаются ниже 0, давая мне NaN, поэтому, если я позже изменю Auto на что-то больше 0, мой NaN останется NaN.
Я только что слышал, как кто-то сказал, что дроби в javascript - это приближения, что является еще одной проблемой. Я попытался зайти в Google, чтобы узнать, является ли это фактом, но ничего не смог найти (возможно, я не искал правильных терминов)
Я уверен, что некоторые из вас столкнулись с подобными проблемами, что бы вы предложили? Кто-то предложил умножить мое исходное число на 100, а затем выполнить все операции, но я боюсь, что это не поможет мне решить проблему потери точности.
Есть идеи?
Я буду признателен за вашу помощь!
2 ответа
Двоичные числа с плавающей точкой неуместны при обработке десятичных дробей, поэтому 0,1 + 0,2 не равно 0,3. Это наиболее часто встречающаяся ошибка в JavaScript, и она является преднамеренным следствием принятия стандарта IEEE для двоичной арифметики с плавающей точкой (IEEE 754). Этот стандарт хорошо подходит для многих приложений, но он нарушает большинство вещей, которые вы узнали о числах в средней школе. К счастью, целочисленная арифметика с плавающей запятой является точной, поэтому ошибок масштабирования можно избежать с помощью масштабирования. Например, значения в долларах можно преобразовать в целые значения центов, умножив их на 100. Затем можно точно добавить центы. Сумма может быть разделена на 100, чтобы конвертировать обратно в доллары. Когда люди считают деньги, люди ожидают, что результаты будут точными.
"JavaScript: хорошие детали Дугласа Крокфорда. Copyright 2008 Yahoo! Inc., 978-0-596-51774-8".
Всегда с валютой отслеживайте это как внутренние целые числа. Все операции должны выполняться на целых числах. Только десятичный для отображения.
проверьте эту скрипку, если вы думаете об использовании десятичных знаков для отслеживания денег.