高分提问悬赏:Java语言浮点数的计算的误差是什么意思,为什么会出现这个情况

高分提问悬赏:Java语言浮点数的计算的误差是什么意思,为什么会出现这个情况
高分提问悬赏:Java语言浮点数的计算的误差是什么意思,为什么会出现这个情况

浮点数值不适用于无法接受舍入误差的
在金融计算中。
例如,命令System.out.println( 2.0-1.1 ) 将打印出 0.8999999999999999, 而不是人们想象的 0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3—样。如果在数值计算中不允许有任何舍入误差,就应该使用 BigDecimal类。

浮点计算的误差和计算值组成原理相关,具体理论不讲了,举个例子来看,比如7.49 * 7.49,但是计算看到的不是7.49而且不断接近7.49的一个数值,最终通过移位相加得到最终的乘积,在每次相加的过程中对于精度会有取舍,所以会存在一定的误差。

(大多数编程语言都存在的误差bug)计算误差主要是来自于计算机原理的误差。在计算机中,一个数是由二进制表示的,整数部分是不用考虑,利用二进制是可以表示所有整数,小数部分就来了,小数部分计算机采用的也是二进制,但是不同的是,适指数去表示,比如0.5就是1/2,也就是2的负一次方,0.25/0.75分别可以表示为2的负二方和2的负一次方加上2的负一次方。你可以理解为小数部分的二级制为 0.5=1,0.25=10,0.75=11(具体的你要去看详细的了),因此带来了问题就是,不是所有的小数都可以完全表示成这种二进制的,那么计算机又是怎么保存的呢,这就是精度,计算机会寻找精度限制内最接近的一个二级制值来保存。也就是这个过程数值被改变了,一般情况下不容易被发现,但是如果经过级数的扩增,这个误差被放大了几个级别之后,就会被发现。因此在统计和经济领域,一般不用这个来保存数值,而是采用其他的数值去保存。大致如如10.01,可以保存为与10相关的整数,2 1001(2表示小数点的位置或者整数的长度) 119.009可以表示为3119009。

浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可预知,并且变得不可逆,浮点数并不适合用于精确计算,而适合进行科学计算。https://blog.csdn.net/code_dream_wq/article/details/74451478 解释的很清楚