Должен ли я использовать Ints для денежных значений в GraphQL? - PullRequest
0 голосов
/ 27 июня 2019

Я знаю, что я должен использовать целые числа для "денежных значений" при программировании. Я знаю, что это из-за проблемы 0.1 + 0.2 != 0.3. Но я не знаю проблему достаточно хорошо, чтобы понять, является ли это проблемой и в форматах данных (таких как JSON).

В моем конкретном случае: я должен определить

type Money {
    amount: Float!
    # ...
}

или

type Money {
    amount: Int!
    # ...
}

в GraphQL?

Ответы [ 2 ]

1 голос
/ 29 июня 2019

GraphQL сам по себе не выполняет никаких сопоставлений между разрешенными значениями. Вы можете ввести логику сортировки или что-то еще, что потребует от вас сравнения двух значений с плавающей запятой, но это будет логика, которую вы реализуете сами, и поэтому вы можете действовать соответственно . Таким образом, решение об использовании Float или Int должно быть основано на потребностях клиентов, использующих API (или, возможно, других ограничений, таких как язык или база данных, которые вы используете в бэкэнде) - никаких дополнительных соображения только потому, что вы имеете дело с GraphQL.

Аналогично, в сериализации или десериализации JSON нет ничего, что требовало бы сравнения значений с плавающей запятой.

Спецификация JSON не ограничивает размер чисел . Таким образом, вы технически могли бы достичь определенного ограничения для конкретного языка при десериализации JSON, будь то целое число или число с плавающей запятой. Но если вы работаете с валютами, я предполагаю, что это крайне маловероятно (например, в JavaScript максимально возможное целочисленное значение составляет 9 007 199 254 740 991 против 100 000 000 000 000 долларов США или около того в обращении всех валют в мире.

1 голос
/ 28 июня 2019

Представление денег в целом - сложная проблема.Обработка валют, форматов, дробных и недробных валют и т. Д.

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

Хороший пример для просмотра - API-интерфейс Graphify от Shopify: https://help.shopify.com/en/api/graphql-admin-api/reference/object/moneyv2

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

...