我知道在编程时应将整数用于“货币值”。我知道是因为0.1 + 0.2 != 0.3
问题。但是我对问题并不十分了解,以至于也不知道数据格式(例如JSON)是否存在问题。
在我的具体情况下:我应该定义
type Money {
amount: Float!
# ...
}
或
type Money {
amount: Int!
# ...
}
在GraphQL中?
答案 0 :(得分:1)
一般来说,代表金钱是一个难题。处理货币,格式,分数和非分数货币等。
将Money建模为复杂的对象类型通常是个好主意。这使您可以根据货币值对更多数据进行编码。另一种选择是定义自己的代表金钱的标量类型。
一个很好的例子是Shopify的GraphQL API:https://help.shopify.com/en/api/graphql-admin-api/reference/object/moneyv2
它们包括货币和金额,定义为小数标量。具有复杂的对象也使您可以随着时间的推移更好地发展该类型。如果添加诸如服务器端格式或货币信息之类的内容,将很难使用Int
或Float
。
答案 1 :(得分:1)
GraphQL本身不对解析值进行任何比较。您可能会引入排序逻辑或其他一些需要比较两个浮点值的逻辑,但这是您自己实现的逻辑,因此可以act accordingly。因此,是否使用Float
或Int
的决定应基于使用API的客户端的需求(或可能存在其他限制,例如您在后端使用的语言或数据库)–不必仅仅因为您正在使用GraphQL而考虑其他问题。
类似地,序列化或反序列化JSON不需要比较浮点值。
JSON规范does not limit the size of numbers。因此,反序列化JSON时,无论是整数还是浮点数,您在技术上都可能会遇到特定于语言的限制。但是,如果您使用的是货币,我猜想这是极不可能的(例如,在JavaScript中,最大的整数值是9,007,199,254,740,991,而世界范围内所有 all 货币总价都在1亿美元左右。