1

线上出现了一个奇怪的问题,但是离线无法重现。

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

以下指令:

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

回报:

10739

在本地测试,结果总是:

10740

如何解决?

4

1 回答 1

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 对应于数据库列定义。

于 2018-12-12T13:54:05.957 回答