首页 > 试题广场 >

为啥有时会出现4.0-3.6=0.40000001这种现象?

[问答题]
请你解释为什么会出现4.0-3.6=0.40000001这种现象?
原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
编辑于 2019-01-07 09:42:47 回复(1)
在二进制系统中无法精确地表示分数1/10,这就好像十进制无法精确地表示分数1/3一样。
编辑于 2019-07-30 17:37:10 回复(5)
3.6的0.6在二进制里是11.100110011001100110011001100110011001100110011001101, double只有52个小数位精度不够所以做了近似计算。并不是所有十进制小数都没法被二进制表达,0.5就是0.1
发表于 2020-04-15 12:40:53 回复(0)
在《Java核心技术 卷I》中是这样说的:
浮点数值不适用于无法接受舍入误差的金融计算中。
例如,命令 System.out.println ( 2.0-1.1 ) 将打印出 0.8999999999999999, 而不是人们想象的 0.9。
这种舍入误差的主要原因是:
浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。
这就好像十进制无法精确地表示分数 1/3—样。
如果在数值计算中不允许有任何舍入误差, 就应该使用 BigDecimal类

编辑于 2020-03-24 10:38:31 回复(0)
二进制系统中不能够精确地表示1/10,就像在十进制系统中不能精确地表示1/3一样,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

编辑于 2024-01-21 09:52:59 回复(0)

跟数位表示法有关,比如十进制的情况下:

123,相当于1*10^2+2*10^1+3*10^0(值*进制^位置,个位0,十位1,百位2

同理:1/10由二进制表示小数的时候只能够表示能够用1/(2^n)
例如:

0.5能够表示,因为它可以表示成为1/2

0.75也能够表示,因为它可以表示成为1/2+1/(2^2)

0.875也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)


发表于 2021-02-06 17:16:37 回复(0)
原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差
发表于 2020-04-21 11:00:38 回复(0)
原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
发表于 2019-04-30 21:46:03 回复(0)