我们知道数值2.9传递给一个double型的变量a时,a就变成了2.899999999999999911182158029987476766109466552734375,而不是2.9。所以,也有了double值比较是否相等时需要比较一个范围的if判断方式。
而在金融系统中,数值计算往往需要精确的计算和表达,这就在java系统中引入了BigDecimal数据类型,但是普通的程序员会记得在java中使用BigDecimal,而往往忽视在json接口开发中,java对象转换成json,再由json转换成java对象时的精度丢失。
因为:java转换成json对象时,BigDecimal就变成了double表达,结果是{"value":2.899999999999999911182158029987476766109466552734375};(这一步丢失了精度)
而再由json转换成java时,调用的是new BigDecimal(double)方法,而不是new BigDecimal(String)方法;因此,数据就在这又丢失了精度(原始数据为2.899999999999999911182158029987476766109466552734375,而转换后成了2.9)。
下图是精度丢失的例子,转换使用的是fasterxml.jackson: