java float double精度为什么会丢失
2个回答
展开全部
首先有一个观念,在计算机里所有的数据都是以二进制的形势保存的。
我们来简单的举个例子,
对于int类型的数值我们不陌生, 10进制类型和2进制的转换也很简单
比如9= 0000 1001, 22=0001 0110 等
(注意:以下x^y 表示x的y次方)
换一种表示方式 9 = 2^3+2^0,22=2^4+2^2+2^1.很简单对不对
但是对于float和double类型的数据就变得不一样了,在清楚为什么精度会丢失的问题之前还需要先明白一件事
就像在10进制里 0.1 = 10^-1 0.01=10^-2 一样 在2进制里 小数点后边的数字也是用2^-n次方来解决的.
那么问题来了,大家都知道 2^-1 =0.5,2^-2=0.25
如果你想表示0.6的话在10进制里可以简单的用6*10^-1次方来表示,但是在2进制里怎么表示呢,?只能用尽可能接近的数据来表示比如 (1*2^-1)+(1*2^-3) 也就是 0.5+0.125 =0.625 约等于0.6 (这里只是举个例子,实际计算机在存储的时候要复杂一些),因为在2进制里边没有“准确”表示 比如 0.1,0.00000001 这样数据的2进制数据.
还有一点,操作系统的位数也会影响到float和double的精度,比如32位和64位
(纯手打 不明白的话 追问)
我们来简单的举个例子,
对于int类型的数值我们不陌生, 10进制类型和2进制的转换也很简单
比如9= 0000 1001, 22=0001 0110 等
(注意:以下x^y 表示x的y次方)
换一种表示方式 9 = 2^3+2^0,22=2^4+2^2+2^1.很简单对不对
但是对于float和double类型的数据就变得不一样了,在清楚为什么精度会丢失的问题之前还需要先明白一件事
就像在10进制里 0.1 = 10^-1 0.01=10^-2 一样 在2进制里 小数点后边的数字也是用2^-n次方来解决的.
那么问题来了,大家都知道 2^-1 =0.5,2^-2=0.25
如果你想表示0.6的话在10进制里可以简单的用6*10^-1次方来表示,但是在2进制里怎么表示呢,?只能用尽可能接近的数据来表示比如 (1*2^-1)+(1*2^-3) 也就是 0.5+0.125 =0.625 约等于0.6 (这里只是举个例子,实际计算机在存储的时候要复杂一些),因为在2进制里边没有“准确”表示 比如 0.1,0.00000001 这样数据的2进制数据.
还有一点,操作系统的位数也会影响到float和double的精度,比如32位和64位
(纯手打 不明白的话 追问)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询