在JSON中传递美元金额的最佳做法是什么?
将金额作为字符串或浮点数传递?或其他?
我们有点担心在客户端(iOS / Android / Web)上显示的舍入错误,或者可能在一个客户端上显示的不同值与另一个客户端相比。
答案 0 :(得分:11)
有效Java,第2版Joshua Bloch说
float和double类型特别不适合货币计算,因为不可能将0.1(或任何其他10的负幂)表示为浮点数或双精度。
例如,假设您有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"
}
您可以选择使用任何提供的数字格式。
decimal:这是一个十进制数 string:与decimal相同但引用,因此您的JSON库认为它是一个字符串。 pretty:准备好向用户显示的字符串。包括适当的货币符号和货币代码。 currency:货币的3个字母的代码。
以下是API的两个示例:
{
"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"
}
}
https://gist.github.com/Fluidbyte/2973986
{
"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
}
}
What is the standard for formatting currency values in JSON?
答案 1 :(得分:8)
我认为一种解决方案是将数量乘以100作为整数
(没有舍入错误,数据库中的安全存储,除非您在货币兑换市场中使用此更多小数,例如)。
这样你就可以操纵你的金额(加法或乘法,......),然后将它再次显示为100。
答案 2 :(得分:1)
JSON没有用于整数和浮点的不同类型 值。因此,JSON Schema不能单独使用类型来区分 整数和非整数之间。
因此,您可以尝试这样的事情。
var jsonObj = [{
"amount": "$1234.46"
},{
"amount": "$2234.56"
},{
"amount": "$3234.66"
}];
for (var i in jsonObj) {
jsonObj[i].amount = '$'+Math.round(jsonObj[i].amount.substring(1,jsonObj[i].amount.length));
}
console.log(jsonObj);
希望,它会按照您的期望工作。感谢
答案 3 :(得分:-1)
我不认为这有一个'最佳实践'。
然而,我的建议是将它们编码为浮点数,这样就不会混合显示美元的方式。例如,您可能希望避免可能传递
{ "dollars": "1,000$" }
{ "dollars": "1000.00$" }
{ "dollars": "1000.00" }
{ "dollars": "$1000.00" }
表示美元的一种更简单的方法是使用浮点数。精度可以变化,这可能是一件好事
{ "dollars": 1000.00 }
{ "dollars": 0.001231231 }
注意由于四舍五入而将0.00呈现为0.001的情况
{ "dollars": 0.005 }