使用GSON序列化BigDecimal值

时间:2017-07-13 09:29:02

标签: java json gson bigdecimal

这是我的代码:

System.out.println(GSON.toJson(new BigDecimal(10.12)));

,输出为:

10.1199999999999992184029906638897955417633056640625

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

10.11

3 个答案:

答案 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));