Java 关于双精度和双精度问题
网上有一个奇怪的问题,但不能离线复制 具体问题如下:数据库中存储的值为107.4,类型为decimal,值由mybatis取值,mybatis配置的java类型为double 以下说明:Java 关于双精度和双精度问题,java,mybatis,bigdecimal,Java,Mybatis,Bigdecimal,网上有一个奇怪的问题,但不能离线复制 具体问题如下:数据库中存储的值为107.4,类型为decimal,值由mybatis取值,mybatis配置的java类型为double 以下说明: BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue() 返回: 10739 在本地测试,结果总是: 10740 如何解决这个问题?如果将该值取为双精度,计算机中107.4的值将已经存在近似误差,因为浮点值是2
BigDecimal.valueOf (the value).multiply(BigDecimal.valueOf(100)).LongValue()
返回:
10739
在本地测试,结果总是:
10740
如何解决这个问题?如果将该值取为双精度,计算机中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与数据库列定义相对应。您可以尝试以下
long val=the value*100
?前面的问题描述有点问题,现在更新到fwiw,107.4
的确切值为107.400000000000000568434188608081486968994140625
@RudyVelthuis谢谢,我喜欢那种精确的技术细节。在这种情况下,该值比10进制表示法107.4稍微大一点double
的精度约为15位,这里您可以看到,理论上对13位小数进行四舍五入可以得到正确的数字(因为107有3位数字)。