这道题数字越大,误差越大
本帖最后由 无理想的闲鱼 于 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-12 14:24 编辑
无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,
这个问题问得好,就拿 64 位双精度浮点数来说吧,64 位数总共有 2 ** 64 = 18446744073709551616 个不同的数值,就是说,64 位双精度浮点数所能够表达不同数值的数量是有限的,如果不限制精度,使用这些数字即便是表达 0.00001~0.00002 之间所有的数值甚至都不够用,因为,浮点数无底,对浮点数而言,如果要做到连续表达,任何一个小区间的数据数量都是无穷多的,这就决定了这种数据只能是有限精度数据类型。可以想象一下我们使用的尺子,可以用来测量各种长度,可是,它是通过有限个刻度来进行衡量的,测出的长度一定带有读数误差。我们所使用的浮点数就非常像一把带有有限刻度的尺子,也是通过固定而有限个刻度来对浮点数进行表达的,这就决定了不可能做到想表达多少就能表达多少,只能通过固定的刻度值进行近似地表达。
进率不精确,你可以在找一个精确一点的进率,代码中的1.609334改成1.6093440000064会好一些 数学中为了计算方便会将Π约值为3.14,但是现实中Π确实如此吗?多联想一下相关的信息,这个问题就会解决的。 本帖最后由 jackz007 于 2022-11-11 21:32 编辑
乘法关系,计算精度仅取决于换算率的精度,并不存在 "数字越大误差越大" 的说法。正确的说法是,只要计算方法一致,无论数字大小,计算结果的精度都是一样的。 本帖最后由 无理想的闲鱼 于 2022-11-11 22:15 编辑
ok、谢谢你们了{:10_298:}
但是我还有一个问题,
3*0.3
0.8999999999999999
3*0.6
1.7999999999999998
如何做到精确运算呢? 可以使用decimal模块和fractions模块,但是也没办法解决所有的精度问题,只能尽可能解决 无理想的闲鱼 发表于 2022-11-11 22:09
ok、谢谢你们了
但是我还有一个问题,
decimal 模块
页:
[1]