使用GSON序列化BigDecimal值

vat*_*ada 3 java json bigdecimal gson

这是我的代码:

System.out.println(GSON.toJson(new BigDecimal(10.12)));
Run Code Online (Sandbox Code Playgroud)

输出是:

10.1199999999999992184029906638897955417633056640625
Run Code Online (Sandbox Code Playgroud)

是否可以限制GSON序列化的BigDecimal值的精度?即我的序列化值的预期输出是:

10.11
Run Code Online (Sandbox Code Playgroud)

cнŝ*_*ŝdk 5

这里的问题不是GSON,而是你的BigDecimal价值.

如果使用new BigDecimal(double value)构造函数,则可能会产生不可预测的结果.

如果你看看BigDecima(双值)构造函数文档,它清楚地说:

笔记:

  • 这个构造函数的结果可能有点不可预测.有人可能会假设在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构造函数:

new BigDecimal("10.12")
Run Code Online (Sandbox Code Playgroud)