原创

浮点数为什么不精确

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://icode.blog.csdn.net/article/details/99687922

浮点数为什么不精确?

其实这句话本身就不精确, 相对精确一点的说法是: 我们在程序里写的 10 进制小数,计算机内部无法用二进制的小数来精确的表达。

因为二进制只能表示 2 的 n 次方的数,n 可以取负值,3.3 无法用 2 的 n 次方的数组合计算出来,所以无法精确表示:
3.3 = 1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+…
(解释:2+1=3,3+1/2>3.3 所以系数是 0)
其中分式的分母只能是 2 的倍数(二进制所限),3.3 的二进制表示是 11.01001…
有些数比如 1/3 就无法精确计算,只能无限逼近

再比如表达十进制的 0.2
0.01 = 1/4 = 0.25 ,太大
0.001 =1/8 = 0.125 , 又太小
0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了
0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了
0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 还是大
0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 这结果不错
0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875
已经很逼近了, 就这样吧。

相关文章:
不能使用 float 和 double 来表示金额等精确的值

文章最后发布于: 2019-08-17 01:52:13
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览