Валютные операции с javaScript? - PullRequest
5 голосов
/ 06 июля 2011

Я создаю бюджетное приложение с помощью JavaScript.Я должен позволить javascript выполнять большинство операций.Таким образом, у меня есть некоторые элементы управления, где пользователь изменяет желаемую сумму для категории, и мое приложение показывает новые суммы для подкатегорий.Так что, если у меня + Авто $ 50,23 - Газ $ 30,25 - Техническое обслуживание $ 6,27 - Страховка $ 10,02 - ...

Поэтому, если пользователь изменит Авто 50,23 на 90,00, суммы за газ, обслуживание, страхование и т. Д. Будут отражать%увеличение их родительской категории.

Проблема в том, что после нескольких операций я теряю точность, и это создает некоторые неприятные ошибки.В большинстве случаев цифры не складываются (как они должны).После изменения суммы для auto несколько раз и затем установки ее на 0, другие суммы не всегда становятся равными 0, и иногда они опускаются ниже 0, давая мне NaN, поэтому, если я позже изменю Auto на что-то больше 0,мой NaN останется NaN.

Я только что услышал, как кто-то сказал, что дроби в javascript - это приближения, что является еще одной проблемой.Я пытался зайти в Google, чтобы узнать, является ли это фактом, но не смог ничего найти (возможно, я не искал правильных терминов)

Я уверен, что некоторые из вас столкнулись с подобными проблемами, чтовы бы предложили?Кто-то предложил умножить мое исходное число на 100, а затем выполнить все операции, но я боюсь, что это не поможет мне решить проблему потери точности.

Есть идеи?

Я буду признателен за вашу помощь!

Ответы [ 2 ]

10 голосов
/ 06 июля 2011

Двоичные числа с плавающей запятой неуместны при обработке десятичных дробей, поэтому 0,1 + 0,2 не равно 0,3.Это наиболее часто встречающаяся ошибка в JavaScript, и она является преднамеренным следствием принятия стандарта IEEE для двоичной арифметики с плавающей точкой (IEEE 754).Этот стандарт хорошо подходит для многих приложений, но он нарушает большинство вещей, которые вы узнали о числах в средней школе.К счастью, целочисленная арифметика в числах с плавающей запятой является точной, поэтому ошибок масштабирования в десятичном представлении можно избежать.Например, значения в долларах можно преобразовать в целые значения в центах, умножив их на 100. Затем можно точно добавить центы.Сумма может быть разделена на 100, чтобы конвертировать обратно в доллары.Люди считают разумным, когда считают деньги, что результаты будут точными.

"JavaScript: Хорошие детали Дугласа Крокфорда. Copyright 2008 Yahoo! Inc., 978-0-596-51774-8 ".

3 голосов
/ 06 июля 2011

Всегда с валютой отслеживайте это как внутренние целые числа.Все операции должны выполняться на целых числах.Используйте только десятичную дробь для отображения.

проверьте эту скрипку , если вы думаете об использовании десятичных знаков для отслеживания денег.

...