我应该在 GraphQL 中使用整数作为货币值吗?

Should I use Ints for monetary values in GraphQL?

我知道在编程时我应该为 "money values" 使用整数。我知道这是因为 0.1 + 0.2 != 0.3 问题。但我对这个问题的了解还不够深,不知道这是否也是数据格式(如 JSON)的问题。

在我的具体案例中:我应该定义

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

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

在 GraphQL 中?

一般来说,表示货币是一个难题。处理货币、格式、分数与 non-fractional 货币等

将货币建模为复杂的对象类型通常是个好主意。这使您能够在货币价值的上下文中编码更多数据。另一种选择是定义您自己的代表金钱的标量类型。

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

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

GraphQL 本身不对已解析的值进行任何比较。您可能会引入排序逻辑或其他需要您比较两个浮点值的逻辑,但这将是您自己实现的逻辑,因此您可以 act accordingly。因此,是否使用 FloatInt 的决定应基于使用 API 的客户的需求(或可能的其他限制,例如您在后端)——没有额外的考虑,因为你正在处理 GraphQL。

同样,序列化或反序列化 JSON 不需要比较浮点值。

JSON 规范does not limit the size of numbers。因此,在反序列化 JSON 时,您 技术上 可能会达到一些 language-specific 限制,无论它是整数还是浮点数。但是,如果您使用的是货币,我猜这是极不可能的(例如,在 JavaScript 中,最大可能的整数值为 9,007,199,254,740,991,而 all[=22 的流通量为 100,000,000,000,000 美元左右=] 世界上的货币。