簡體   English   中英

使用GSON序列化BigDecimal值

[英]Serializing BigDecimal value using GSON

這是我的代碼:

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

輸出是:

10.1199999999999992184029906638897955417633056640625

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

10.11

這里的問題不是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")

這不是GSON問題。 new BigDecimal()嘗試准確地表示雙重並最終獲得更多的數字。

您可以使用BigDecimal.valueOf(10.12)new BigDecimal("10.12")代替new BigDecimal()

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

而不是依賴於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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM