Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于双精度和双精度问题_Java_Mybatis_Bigdecimal - Fatal编程技术网

Java 关于双精度和双精度问题

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

网上有一个奇怪的问题,但不能离线复制

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

以下说明:

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位数字)。