在线存在一个奇怪的问题,但无法离线复制。
具体问题如下:数据库中存储的值为107.4,类型为十进制,值由mybatis获取,mybatis配置的java类型为double
以下说明:
BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()
返回:
10739
在本地测试,结果始终为:
10740
如何解决?
答案 0 :(得分:3)
如果将值设为double
,则计算机中的107.4值将已经有一个近似误差,因为浮点值是2的(负)次幂的有限和。
现在存在一些四舍五入的问题,fp-strict和更多问题,但更好地消除原因,并使用BigDecimal
代替double
。请注意,new BigDecimal(107.4)
不会这样做,只会new BigDecimal("107.4")
或自行校正精度/刻度。
double value = 107.4; // Might actually be more like 107.39999987.
BigDecimal x = new BigDecimal(value).setScale(1, BigDecimal.ROUND_HALF_UP);
小数位数1与数据库列定义相对应。