鱼C论坛

 找回密码
 立即注册
查看: 3763|回复: 7

[已解决]这道题数字越大,误差越大

[复制链接]
发表于 2022-11-11 18:39:54 | 显示全部楼层 |阅读模式
12鱼币
本帖最后由 无理想的闲鱼 于 2022-11-11 22:17 编辑

问题一:
这是英里和公里的进制转换
dis = input("千米km结束,英里ml结束:")#如30km
if dis[len(dis)-2:len(dis)]=="ml":
    km = int(dis[0:len(dis)-2])*1.609334
    print("{}英里为等于{:2f}千米".format(float(dis[:-2]),km))
if dis[len(dis)-2:len(dis)]=="km":
    ml = int(dis[0:len(dis)-2])/1.609334
    print("{}千米为等于{:2f}英里".format(float(dis[:-2]),ml))

百度找一个转换器 10 千米=6.21371192237 英里         100000 千米=         62137.1192237英里      100000000000 千米=         62137119223.73 英里

我的转换出来是    10.0千米为等于6.213751英里          100000.0千米为等于62137.505328英里        100000000000.0千米为等于62137505328.291077英里


怎么解决问题呢?

问题二:
3*0.6
1.7999999999999998
3*0.3
0.8999999999999999
怎么做到精确计算呢?
最佳答案
2022-11-11 18:39:55
本帖最后由 jackz007 于 2022-11-12 14:24 编辑
无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,


       这个问题问得好,就拿 64 位双精度浮点数来说吧,64 位数总共有 2 ** 64 = 18446744073709551616 个不同的数值,就是说,64 位双精度浮点数所能够表达不同数值的数量是有限的,如果不限制精度,使用这些数字即便是表达 0.00001~0.00002 之间所有的数值甚至都不够用,因为,浮点数无底,对浮点数而言,如果要做到连续表达,任何一个小区间的数据数量都是无穷多的,这就决定了这种数据只能是有限精度数据类型。可以想象一下我们使用的尺子,可以用来测量各种长度,可是,它是通过有限个刻度来进行衡量的,测出的长度一定带有读数误差。我们所使用的浮点数就非常像一把带有有限刻度的尺子,也是通过固定而有限个刻度来对浮点数进行表达的,这就决定了不可能做到想表达多少就能表达多少,只能通过固定的刻度值进行近似地表达。
        

最佳答案

查看完整内容

这个问题问得好,就拿 64 位双精度浮点数来说吧,64 位数总共有 2 ** 64 = 18446744073709551616 个不同的数值,就是说,64 位双精度浮点数所能够表达不同数值的数量是有限的,如果不限制精度,使用这些数字即便是表达 0.00001~0.00002 之间所有的数值甚至都不够用,因为,浮点数无底,对浮点数而言,如果要做到连续表达,任何一个小区间的数据数量都是无穷多的,这就决定了这种数据只能是有限精度数据类型。可以想象一 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-11 18:39:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-12 14:24 编辑
无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,


       这个问题问得好,就拿 64 位双精度浮点数来说吧,64 位数总共有 2 ** 64 = 18446744073709551616 个不同的数值,就是说,64 位双精度浮点数所能够表达不同数值的数量是有限的,如果不限制精度,使用这些数字即便是表达 0.00001~0.00002 之间所有的数值甚至都不够用,因为,浮点数无底,对浮点数而言,如果要做到连续表达,任何一个小区间的数据数量都是无穷多的,这就决定了这种数据只能是有限精度数据类型。可以想象一下我们使用的尺子,可以用来测量各种长度,可是,它是通过有限个刻度来进行衡量的,测出的长度一定带有读数误差。我们所使用的浮点数就非常像一把带有有限刻度的尺子,也是通过固定而有限个刻度来对浮点数进行表达的,这就决定了不可能做到想表达多少就能表达多少,只能通过固定的刻度值进行近似地表达。
        

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-11 18:52:09 | 显示全部楼层
进率不精确,你可以在找一个精确一点的进率,代码中的1.609334改成1.6093440000064会好一些

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-11 20:41:38 | 显示全部楼层
数学中为了计算方便会将Π约值为3.14,但是现实中Π确实如此吗?多联想一下相关的信息,这个问题就会解决的。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-11 21:31:34 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-11 21:32 编辑

         乘法关系,计算精度仅取决于换算率的精度,并不存在 "数字越大误差越大" 的说法。正确的说法是,只要计算方法一致,无论数字大小,计算结果的精度都是一样的。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-11 22:09:20 | 显示全部楼层
本帖最后由 无理想的闲鱼 于 2022-11-11 22:15 编辑

ok、谢谢你们了
但是我还有一个问题,
3*0.3
0.8999999999999999
3*0.6
1.7999999999999998
如何做到精确运算呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-12 10:29:06 | 显示全部楼层
可以使用decimal模块和fractions模块,但是也没办法解决所有的精度问题,只能尽可能解决

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-12 14:38:02 | 显示全部楼层
无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,

decimal 模块

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
无理想的闲鱼 + 1 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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