Рубрики
Без рубрики

Как обрабатывать денежные значения в JavaScript

Сарой Дайн, как справляться с денежными ценностями в JavaScriptPhoto по каталогу мысли на unsplashmoney – это везде. Банковские приложения, веб-сайты электронной коммерции, фондовые биржевые платформы – мы ежедневно общаемся с деньгами. Мы также все чаще полагаемся на технологии, чтобы справиться с нашей. Тем не менее, нет консенсуса вокруг того, как программно справляться с денежными ценностями.

Автор оригинала: FreeCodeCamp Community Member.

Сарха Дайн

Деньги везде.

Банковские приложения, веб-сайты электронной коммерции, фондовые биржевые платформы – мы ежедневно общаемся с деньгами. Мы также все чаще полагаемся на технологии, чтобы справиться с нашей.

Тем не менее, нет консенсуса вокруг того, как программно справляться с денежными ценностями. Это распространенная концепция в современных обществах, но это не первый классный тип данных на любом основном языке, в то время как такие вещи, как дата и время. В результате Каждое количество программного обеспечения приводит к собственному обращению с деньгами, со всеми подводными камнями, которые поставляются с ним Отказ

Ловушка № 1: Деньги как число

Ваш первый инстинкт, когда вам нужно представлять деньги, могут быть использованы Номер Отказ

Деньги – не что иное, как числовое значение, верно? Неправильный.

Сумма частью денежной стоимости только относительно другого аспекта: его валюта. Там нет такой вещи, как 10 “денег. «Это 10 долларов, 10 евро, 10 биткойнов … Если вы хотите добавить две денежные значения с разными валютами, вам нужно сначала преобразовать их. То же самое, если вы хотите сравнить их: если все, что у вас есть, это сумма, вы не можете сделать точное сравнение. Сумма и валюта не могут пойти друг с другом Отказ

Ловушка № 2: Плавающая точка Математика

Большинство современных валют являются либо десятичными, либо не имеют никаких подразделений вообще. Это означает, что когда деньги имеют подразряд, количество из них в основном блоке – это мощность 10. Например, в долларе есть 100 центов, находясь от 10 до мощности 2.

Использование десятичной системы имеет преимущества, но повышает основную проблему, когда речь идет о программировании. Компьютеры используют двоичную систему, так что Они не могут представлять десятичные числа Отказ Некоторые языки придумали свои собственные решения, такие как BigDecimal Тип в Java или Десятичная Тип в C #. JavaScript имеет только Номер Тип, который можно использовать как целое число или Двойная точность поплавка . Потому что это двоичное представление системы базы 10, Вы в конечном итоге с неточными результатами, когда вы пытаетесь сделать математику Отказ

0.1 + 0.2 // returns 0.30000000000000004 ? 

Использование поплавков для хранения денежных значений – плохое представление Отказ

Когда вы рассчитываете больше значений, незаметные прецизионные ошибки приводят к увеличению пробелов. Это неизбежно заканчивается, вызывая проблемы округления.

Ловушка № 3: процент против распределения

Иногда вам нужно разделить деньги, но проценты не могут резать его без добавления или потерять копейки Отказ

Представьте себе, что вам нужно законопроект на 999,99 долл. США за счет 50%. Это можно сделать с какой-то простой математикой. Половина составляет $ 499,995, но вы не можете разделить копейки, чтобы вы могли бы расторгнуть результат до 500 долларов. Проблема в том, что вы заряжаете вторую половину, вы заканчиваете тот же результат и заряжаете дополнительную плату.

Вы не можете полагаться исключительно на проценты или подразделения, чтобы разделить деньги, потому что Это не делится до бесконечности Отказ Цена газа может показать более двух вариантов дроби, но это только символичен: вы всегда в конечном итоге выплачивают округлую цену.

Инженерия на спасение

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

К счастью, Инженер-программист Мартин Фаулер придумал решение Отказ В Шаблоны архитектуры приложений предприятия он описывает Узор для денежных ценностей :

Характеристики

Методы

  • Математика: добавить, вычесть, умножить, выделить
  • Сравнение: равен, больше, чем больше или равно, меньше, меньше, чем меньше или равно.

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

Деньги как структура данных

Деньги ведут себя по-разному от простого числа, и, таким образом, следует относиться к по-разному. Первое и самое главное, что Это всегда должно быть состоит из суммы и валюты Отказ

Вы можете сделать все с суммы и валюты. Вы можете добавить денежные суммы вместе, проверьте, будут ли они равны или нет, и отформатировать их в то, что вам нужно. Это можно сделать через методы объекта. В JavaScript любая функция, которая возвращает объект, сделает трюк Отказ

Суммы в центах

Есть несколько способов решить проблему с плавающей точкой в JavaScript.

Вы можете использовать библиотеки, такие как Decimal.js Это будет справиться с вашими поплавками как строки. Это не плохое решение, и даже пригодится, когда вам нужно обращаться Большие цифры . Тем не менее, он наступает за счет добавления (тяжелой) зависимости, что приводит к более медленнее ;| Отказ

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

(0.2 * 100 + 0.01 * 100) / 100 // returns 0.21 ? 

Это прекрасное решение, но требует дополнительных расчетов по конструкции объекта, либо на каждом манипуляциях. Это не обязательно сливается на производительность, но все еще больше обрабатывает работу, чем необходимо.

Третья альтернатива – напрямую хранить значения в центах, относительно единицы. Если вам нужно хранить 10 центов, вы не будете хранить 0,1 , но 10 Отказ Это позволяет вам работать только с целыми числами, что означает безопасные расчеты (пока вы не ударили большие числа ) и отличные результаты.

Dinero.js, неизменяемая библиотека для создания, рассчитанного и формата денежных средств

Из этих наблюдений я сделал библиотеку JavaScript: Dinero.js Отказ

Dinero.js следует за рисунком Фаулера и больше. Он позволяет создавать, рассчитать и форматировать денежные значения в JavaScript. Вы можете делать математику, разбираться и отформатировать свои объекты, задайте им вопросы и проще проводите процесс развития.

Библиотека была разработана, чтобы быть неизменными и церемыми. Он поддерживает глобальные настройки, имеет расширенные параметры форматирования и обеспечивают новую поддержку интернационализации.

Почему неизменно?

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

С Dinero.js вы можете выполнять расчеты, не беспокоясь об изменении оригинальных экземпляров. В следующих примере Vue.js Цена не будет изменено, когда PriceWithTax называется. Если бы экземпляр был изменен, это бы.

const vm = new Vue({  data: {    price: Dinero({ amount: 500 })  },  computed: {    priceWithTax() {      return this.price.add(this.price.percentage(10))    }  }})

Цепность

Хорошие разработчики стремятся сделать их кодом более лаконичным и легче читать. Когда вы хотите последовательно выполнить несколько операций на одном объекте, цепочка предоставляет элегантную обозначение и краткий синтаксис.

Dinero({ amount: 500 })  .add(Dinero({ amount: 200 }))  .multiply(4)  .setLocale('fr-FR')  .toFormat() // returns "28,00 US$"

Глобальные настройки

Когда вы обращаетесь с множеством денежных ценностей, вероятность, что вы хотите, чтобы некоторые из них поделились некоторыми атрибутами. Если вы делаете сайт на немецком языке, вы, вероятно, захотите показать суммы с немецким валютным форматом.

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

Dinero.globalLocale = 'de-DE'Dinero({ amount: 500 }).toFormat() // returns "5,00 $"

Поддержка собственной интернационализации

Традиционно библиотеки используют файлы локали для интернационализации. Если вы исчерпываете, они имеют тенденцию делать библиотеки намного тяжелее.

Файлы локали также трудно поддерживать. API интернационализации является родным и Довольно хорошо поддерживается . Если вы не работаете с устаревшими и/или маржинальными браузерами, ТОФОРМАТ безопасен в использовании.

Форматирование

Объект приятно хранить данные, но не так полезно, когда дело доходит до его отображения. Dinero.js поставляется с различными методами форматирования, в том числе ТОФОРМАТ Отказ Он обеспечивает интуитивно понятный и краткий синтаксический сахар над Номер. Прототип. Толокалестринг Отказ Соедините это с SetLocale И вы сможете отобразить любой объект Dinero в правильный формат на любом языке. Это особенно полезно для многоязычных сайтов электронной коммерции.

Что дальше?

Денежный узор Фаулера широко признан великим решением. Он вдохновил многих реализаций на многих языках. Если вы в DIY, я рекомендую его и наблюдения из этой статьи в качестве отправной точки. Или вы можете выбрать Dinero.js : Современное, надежное, полностью проверенное решение, которое уже работает.

Повеселись!

Любые вопросы о dinero.js? Или о том, как сделать свои собственные денежные данные структуры? Давайте поговорим о Твиттер !

Первоначально опубликовано frontstuff.io .

Оригинал: “https://www.freecodecamp.org/news/how-to-handle-monetary-values-in-javascript-3fef5eeb3eda/”