[英]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.