线上出现了一个奇怪的问题,但是离线无法重现。
具体问题如下:数据库中存储的值为107.4,类型为decimal,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 对应于数据库列定义。
关于java - 关于double和bigdecimal的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743845/