线上出现了一个奇怪的问题,但是离线无法重现。
具体问题如下:数据库中存储的值为107.4,类型为十进制,mybatis取值,mybatis配置的java类型为double
以下指令:
BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()
回报:
10739
在本地测试,结果总是:
10740
如何解决?
线上出现了一个奇怪的问题,但是离线无法重现。
具体问题如下:数据库中存储的值为107.4,类型为十进制,mybatis取值,mybatis配置的java类型为double
以下指令:
BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()
回报:
10739
在本地测试,结果总是:
10740
如何解决?
如果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 对应于数据库列定义。