FastJson是一個Json序列化工具,它可以將Java對象轉換成Json格式的字符串,也可以將Json格式的字符串轉換成對應的Java對象。一些開發者在使用FastJson時,發現它轉換Json格式的數字類型會存在精度問題。例如:當Json格式的數據中有一個小數,FastJson轉成對象時,有可能會發生精度丟失問題。
//Json格式的數據 String jsonString = "{'price': 0.15053166}"; //將Json格式數據轉換成Java對象 Object object = JSON.parseObject(jsonString, Object.class); //將Java對象轉換成Json格式數據 String jsonResult = JSON.toJSONString(object);
在上述代碼中,將Json格式的數據"{'price': 0.15053166}"轉換成Java對象后,再將Java對象轉換成Json格式的數據,得到的Json數據字符串中,小數點后面的數字精度會發生改變,可能從0.15053166變成了0.15053166000000001。
發生這種現象的原因是Java語言的double類型是用二進制來表示十進制的小數的,但是在Java轉Json時,會將double類型強制轉換為Java的BigDecimal類型,這種轉換可能會導致精度損失。
為了解決這個問題,我們可以使用FastJson的SerializerFeature,將Java的BigDecimal類型轉換成字符串類型,再將字符串類型的數據解析成Java的BigDecimal類型。這樣就可以防止精度丟失的問題。
//Json格式的數據 String jsonString = "{'price': 0.15053166}"; //將Json格式數據轉換成Java對象 Object object = JSON.parseObject(jsonString, Object.class, Feature.UseBigDecimal); //將Java對象轉換成Json格式數據 String jsonResult = JSON.toJSONString(object, SerializerFeature.WriteBigDecimalAsPlain);
在上述代碼中,將Json格式的數據"{'price': 0.15053166}"轉換成Java對象后,再將Java對象轉換成Json格式的數據,可以發現得到的Json數據字符串的小數點后面的數字精度與原來的保持一致,這樣就解決了FastJson轉換Json格式的對象丟失精度的問題。