c语言实数的输出和占位_c语言为什么输入 一个实数123.123输出的结果会变?

简单点说,十进制数如何表示1/3呢,0.333333……,再乘以几个10也抹不掉小数点!

二进制数如何表示0.3呢?再乘以几个2也抹不掉小数点!

3.14159269不能用八位十进制31415926表示

123.123同样不能用二十三位的float表示

------------------------打比方和原理的分割线

浮点数由1位符号位 + 若干位指数位 + 若干小数位 组成

float就是1位符号位 + 8位指数位 +23位小数位

float:2^23=8388608,一共7位,能绝对能保证的为6位,也即float的精度为6~7位。

123.123转化的时候,先将123转化为1111011

再将0.123转化为(假设)0001010100110011001010010100100101010010……

最后加起来123.123就是1111011.000101010011001100101001010010010101001……

注意:因为有效位数的关系,只能截取24位有效数据,误差就产生在这里

(对于第一位的1不存储,第0至第22位,放入11101100010101001100110,其他第23至31位都是表示的位移方向、位移长度、正负等)

当然因为是printf的关系,默认只有6位小数,其实还原到显示的值并不是123.123001

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值