无理想的闲鱼 发表于 2022-11-11 18:39:54

这道题数字越大,误差越大

本帖最后由 无理想的闲鱼 于 2022-11-11 22:17 编辑

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

怎么做到精确计算呢?

jackz007 发表于 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 之间所有的数值甚至都不够用,因为,浮点数无底,对浮点数而言,如果要做到连续表达,任何一个小区间的数据数量都是无穷多的,这就决定了这种数据只能是有限精度数据类型。可以想象一下我们使用的尺子,可以用来测量各种长度,可是,它是通过有限个刻度来进行衡量的,测出的长度一定带有读数误差。我们所使用的浮点数就非常像一把带有有限刻度的尺子,也是通过固定而有限个刻度来对浮点数进行表达的,这就决定了不可能做到想表达多少就能表达多少,只能通过固定的刻度值进行近似地表达。
      

tommyyu 发表于 2022-11-11 18:52:09

进率不精确,你可以在找一个精确一点的进率,代码中的1.609334改成1.6093440000064会好一些

我还在你身旁 发表于 2022-11-11 20:41:38

数学中为了计算方便会将Π约值为3.14,但是现实中Π确实如此吗?多联想一下相关的信息,这个问题就会解决的。

jackz007 发表于 2022-11-11 21:31:34

本帖最后由 jackz007 于 2022-11-11 21:32 编辑

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

无理想的闲鱼 发表于 2022-11-11 22:09:20

本帖最后由 无理想的闲鱼 于 2022-11-11 22:15 编辑

ok、谢谢你们了{:10_298:}
但是我还有一个问题,

3*0.3
0.8999999999999999
3*0.6
1.7999999999999998

如何做到精确运算呢?

lxping 发表于 2022-11-12 10:29:06

可以使用decimal模块和fractions模块,但是也没办法解决所有的精度问题,只能尽可能解决

tommyyu 发表于 2022-11-12 14:38:02

无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,



decimal 模块
页: [1]
查看完整版本: 这道题数字越大,误差越大