MATLAB生成数值序列时的数值精度异常原因咨询
为什么4.1/0.1的结果会被近似为40?
先看你做的测试:
[input] 3.9/0.1 : 4.1/0.1 [output] 39 40
加了round()之后结果就符合预期了:
[input] 3.9/0.1 : round(4.1/0.1) [output] 39 40 41
这问题的核心是浮点数的二进制存储精度限制:
- 十进制里的0.1转换成二进制是无限循环小数,计算机无法精确存储,只能保存一个近似值。
- 4.1同样无法用二进制精确表示,实际存储的是一个略小于4.1的近似值。
- 计算
4.1/0.1时,本质是两个近似值做除法,得到的结果会略小于41(比如实际可能是40.99999999999999)。 - 直接输出时的隐式取整会截断小数部分,所以得到40;而
round()函数会根据数值的接近程度做四舍五入,把这个接近41的近似值判定为41。
另外提一句,3.9/0.1能得到39只是巧合——3.9的近似值除以0.1的近似值刚好非常接近39,截断后得到准确结果,但本质同样是浮点数精度导致的近似计算。
内容的提问来源于stack exchange,提问作者Steven Ding
相关产品推荐
相关产品推荐

