在JSON中传递美元金额的最佳做法是什么?

Mar*_*ers 12 floating-point json

在JSON中传递美元金额的最佳做法是什么?

将金额作为字符串或浮点数传递?或其他?

我们有点担心在客户端(iOS/Android/Web)上显示的舍入错误,或者可能在一个客户端上显示的不同值与另一个客户端相比.

vaq*_*han 13

有效的Java,第2版Joshua Bloch说

float和double类型特别不适合进行货币计算,因为不可能将0.1(或任何其他10的负幂)表示为float或double.

例如,假设您有1.03美元,而您花费42c.你还剩多少钱?

System.out.println(1.03 - .42); 打印出0.6100000000000001.

解决此问题的正确方法是使用BigDecimal,int或long.

永远不要在浮点变量中持有货币值.浮点不适合货币使用定点或小数值.

如果以几种不同的格式提供货币代码和相同的价值,那就更好了.考虑这个典型的响应,金额为0.00234

"amount": {
  "currency": "USD",
  "decimal": 0.00234,
  "integer": 234000,
  "integer_scale": 8,
  "pretty": "\u0e3f 0.00234 BTC",
  "string": "0.00234"
}
Run Code Online (Sandbox Code Playgroud)

您可以选择使用任何提供的数字格式.

decimal:这是一个十进制数字字符串:与十进制相同但引用,因此您的JSON库认为它是一个字符串.pretty:准备好向用户显示的字符串.包括适当的货币符号和货币代码.currency:货币的3个字母的代码.

以下是API的两个示例:

1 - JSON中的通用货币代码

{
    "USD": {
        "symbol": "$",
        "name": "US Dollar",
        "symbol_native": "$",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "USD",
        "name_plural": "US dollars"
    },
    "CAD": {
        "symbol": "CA$",
        "name": "Canadian Dollar",
        "symbol_native": "$",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "CAD",
        "name_plural": "Canadian dollars"
    },
    "EUR": {
        "symbol": "€",
        "name": "Euro",
        "symbol_native": "€",
        "decimal_digits": 2,
        "rounding": 0,
        "code": "EUR",
        "name_plural": "euros"
    }
}
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/Fluidbyte/2973986

2 - Fixer API

http://api.fixer.io/latest

{
    "base": "EUR",
    "date": "2017-07-28",
    "rates": {
        "AUD": 1.4732,
        "BGN": 1.9558,
        "BRL": 3.7015,
        "CAD": 1.4712,
        "CHF": 1.1357,
        "CNY": 7.9087,
        "CZK": 26.048,
        "DKK": 7.4364,
        "GBP": 0.89568,
        "HKD": 9.1613,
        "HRK": 7.412,
        "HUF": 304.93,
        "IDR": 15639,
        "ILS": 4.1765,
        "INR": 75.256,
        "JPY": 130.37,
        "KRW": 1317.6,
        "MXN": 20.809,
        "MYR": 5.0229,
        "NOK": 9.3195,
        "NZD": 1.5694,
        "PHP": 59.207,
        "PLN": 4.2493,
        "RON": 4.558,
        "RUB": 69.832,
        "SEK": 9.5355,
        "SGD": 1.5947,
        "THB": 39.146,
        "TRY": 4.1462,
        "USD": 1.1729,
        "ZAR": 15.281
    }
}
Run Code Online (Sandbox Code Playgroud)

在JSON中格式化货币值的标准是什么?


Maj*_*ssi 8

我认为一种解决方案是将数量乘以100作为整数

  • 100美元 - > 10000
  • 1.5美元 - > 150
  • 19.99美元 - > 1999年

(没有舍入错误,数据库中的安全存储,除非您在货币兑换市场中使用此更多小数,例如).

这样你就可以操纵你的金额(加法或乘法,......),然后将它再次显示为100.

  • 究竟.如果您认为需要浮点,则可能不了解缩放.对钱来说这是一个独特的可怕想法!记住"当天回来"C甚至没有浮动点,这并不重要,因为[CPU](https://en.wikipedia.org/wiki/Intel_8087)无论如何都无法真正做到这一点. (2认同)

Bel*_*rdz -4

我认为这方面没有“最佳实践”。

然而,我的建议是将它们编码为浮点数,这样就不会混合显示美元的方式。例如,您希望避免可能通过

{ "dollars": "1,000$" }
{ "dollars": "1000.00$" }
{ "dollars": "1000.00" }
{ "dollars": "$1000.00" }
Run Code Online (Sandbox Code Playgroud)

表示美元的一种更简单的方法是使用浮点数。精度可能会有所不同,这可能是一件好事

{ "dollars": 1000.00 }
{ "dollars": 0.001231231 }
Run Code Online (Sandbox Code Playgroud)

注意由于四舍五入导致 0.00 呈现为 0.001 的情况

{ "dollars": 0.005 }
Run Code Online (Sandbox Code Playgroud)