找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2676|回复: 3

[求助] 新手自学求助

1

主题

1

帖子

1

积分

贫民

积分
1
fffdk 发表于 2017-12-18 18:21:57 | 显示全部楼层 |阅读模式
自学中,想问各位大佬,按照递增的话不应该是0.01 0.02  0.03  这样增加到2.99 3.00 的么? 为什么会出现2.99999999999998小数点这么多位?
123123.JPG
回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2017-12-18 21:58:58 | 显示全部楼层
因为计算机是用二进制运算的,做浮点运算时会截去过长的尾数,所以会造成结果的不精确.
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-19 15:59:58 | 显示全部楼层
计算机保存数据都是二进制的形式,分有效数字部分和指数部分如0.5 查看其16进制格式print((0.5).hex())  #'0x1.0000000000000p-1' 其中 0x1.0000000000000是有效数字部分,-1是指数部分,1*2^-1 = 0.5
如print((8.25).hex()) # 0x1.0800000000000p+3 其中1.08是有效数字部分, +3是指数部分,注意这里的1.08是16进制的,其10进制的值是1 + 8 * 16^-2 = 1.03125, 指数部分是3所以1.03125 * 2^3 = 8.25
因此:

print((0.1).hex())  # '0x1.999999999999ap-4' 同上不解释,最后一位a是十进制的10

print((0.2).hex())  # '0x1.999999999999ap-3'
print((0.1 + 0.2).hex()) # 0x1.3333333333334p-2 二进制加法
print((0.3).hex()) # 0x1.3333333333333p-2 可以看出0.1 + 0.2!= 0.3
回复 支持 反对

使用道具 举报

5

主题

11

帖子

11

积分

贫民

积分
11
xingyun1688 发表于 2017-12-19 16:47:46 | 显示全部楼层
对楼上说的很对,类似的问题还有round()命令也会出现这种现象,因为python的数为二进制计算的。会和预期不一样。楼主随便找一本python基础书,都会提到这一点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表