在接手開發一個需求(數據庫字段由兩位小數修改為保留三位小數,數據庫中字段類型為decimal(18,2c))時,發現Bigdecimal精度丟失。
1、原本現有代碼實體類中定義的字段是Double,我直接修改了數據庫字段類型為decimal(18,3),然后在測試時發現第三位小數在前端傳值到后端映射參數值的時候精度丟失。
2、修改實體類中字段類型為Bigdecimal,此時在前端傳到后端的值精度不丟失,並且數據庫中保存的值也正確,但是在前端查詢反顯時精度又丟失了。經過分析,最后得出的結論是前端js解析小數是用的double解析的,精度會有損失。
最后解決方法是在實體類這個字段定義的時候加上注解:@JsonSerialize(using = ToStringSerializer.class),這樣傳到前端的時候就會以String類型解析,不會再以double解析,就不會丟失精度。
還有一種就是直接在實體類中定義為String類型,不會丟失精度,只是這種方式在涉及到計算的時候要重新轉換類型。