我应该在GraphQL中将Ints用作货币值吗?

时间:2019-06-27 19:52:45

标签: json graphql dataformat

我知道在编程时应将整数用于“货币值”。我知道是因为0.1 + 0.2 != 0.3问题。但是我对问题并不十分了解,以至于也不知道数据格式(例如JSON)是否存在问题。

在我的具体情况下:我应该定义

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

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

在GraphQL中?

2 个答案:

答案 0 :(得分:1)

一般来说,代表金钱是一个难题。处理货币,格式,分数和非分数货币等。

将Money建模为复杂的对象类型通常是个好主意。这使您可以根据货币值对更多数据进行编码。另一种选择是定义自己的代表金钱的标量类型。

一个很好的例子是Shopify的GraphQL API:https://help.shopify.com/en/api/graphql-admin-api/reference/object/moneyv2

它们包括货币和金额,定义为小数标量。具有复杂的对象也使您可以随着时间的推移更好地发展该类型。如果添加诸如服务器端格式或货币信息之类的内容,将很难使用IntFloat

答案 1 :(得分:1)

GraphQL本身不对解析值进行任何比较。您可能会引入排序逻辑或其他一些需要比较两个浮点值的逻辑,但这是您自己实现的逻辑,因此可以act accordingly。因此,是否使用FloatInt的决定应基于使用API​​的客户端的需求(或可能存在其他限制,例如您在后端使用的语言或数据库)–不必仅仅因为您正在使用GraphQL而考虑其他问题。

类似地,序列化或反序列化JSON不需要比较浮点值。

JSON规范does not limit the size of numbers。因此,反序列化JSON时,无论是整数还是浮点数,您在技术上都可能会遇到特定于语言的限制。但是,如果您使用的是货币,我猜想这是极不可能的(例如,在JavaScript中,最大的整数值是9,007,199,254,740,991,而世界范围内所有 all 货币总价都在1亿美元左右。