关于双精度和十进制精度问题

时间:2018-12-12 13:13:11

标签: java mybatis bigdecimal

在线存在一个奇怪的问题,但无法离线复制。

具体问题如下:数据库中存储的值为107.4,类型为十进制,值由mybatis获取,mybatis配置的java类型为double

以下说明:

BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()

返回:

10739

在本地测试,结果始终为:

10740

如何解决?

1 个答案:

答案 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与数据库列定义相对应。