这是我的代码:
System.out.println(GSON.toJson(new BigDecimal(10.12)));
,输出为:
10.1199999999999992184029906638897955417633056640625
是否可以限制GSON序列化的BigDecimal值的精度?即我预期的序列化值输出是:
10.11
答案 0 :(得分:5)
此处的问题不是 GSON ,而是使用BigDecimal
值。
如果使用new BigDecimal(double value)
构造函数,则可能会产生不可预测的结果。
如果你看一下BigDecima(double value) constructor documentation,它会清楚地说:
备注:强>
此构造函数的结果可能有些不可预测。一 可能会假设在Java中编写新的BigDecimal(0.1)会创建一个 BigDecimal正好等于0.1(未缩放的值为1,带有 比例为1),但它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能完全表示为double(或者为此) 重要的是,作为任何有限长度的二进制分数)。因此,价值 传入构造函数的不完全等于 0.1,尽管有外表。
另一方面,String构造函数是完全可预测的: 编写新的BigDecimal(" 0.1")会创建一个完全正确的BigDecimal 等于0.1,正如人们所期望的那样。因此,一般来说 建议首先使用String构造函数 之一。
所以最好在这里使用 BigDecimal String
constructor :
new BigDecimal("10.12")
答案 1 :(得分:2)
这不是GSON
问题。 new BigDecimal()
尝试准确地表示双倍并最终获得更多数字。
您可以使用BigDecimal.valueOf(10.12)
或new BigDecimal("10.12")
代替new BigDecimal()
。
System.out.println(GSON.toJson(BigDecimal.valueOf(10.12)));
答案 2 :(得分:0)
最好不要依赖BigDecimal的构造函数,而是在使用GSON序列化之前将其格式化为所需的精度。
BigDecimal提供了一种将其转换为float(floatValue
)的方法,您可以使用String.format(expr, float)
函数根据需要对其进行格式化。
BigDecimal value = new BigDecimal(10.12);
String strValue = String.format("%.2f", value.floatValue());
System.out.println(GSON.toJson(strValue));