舍入误差

1.11*100 = 111.00000000000001
0.1+0.2!=0.3 true

0.1+0.2 = 0.30000000000000004
0.1 * 1000 + 0.2 * 1000 != 0.3 * 1000 false

听说阿里在做数值计算的时候,都是先乘以一个大的数,在做数值计算
把一个浮点数在计算机中表示,可能会引起误差,这样的误差叫做表示误差

这种数值计算方法会将数值保存为二进制然后进行计算,由于浮点数用二进制表达时是无穷的,所以在进行算术计算时会产生舍入误差,由于舍入误差的存在,浮点数计算的精确度远远不如整数计算,最后记住了永远不要测试某个特定浮点数的数值。
所以杨绛先生说的对,年轻人就是想的多读书少,没文化总是动不动就会怀疑人生,所以还是要多读书啊!!!

转载于:https://www.cnblogs.com/gloxing/p/8657967.html

在计算机科学和数值计算中,**数字舍入误差(Rounding Error)** 是由于计算机使用有限精度的浮点数表示实数而导致的误差。这种误差在进行浮点数计算时经常出现,尤其是在科学计算、金融计算、机器学习等领域。 --- ## ✅ 浮点数表示的局限性 计算机使用 **IEEE 754 标准** 来表示浮点数,常见的有: - `float32`:单精度浮点数,大约 7 位有效数字 - `float64`:双精度浮点数,大约 15 位有效数字 由于浮点数只能表示有限精度的实数,某些实数无法精确表示,只能近似表示,这就导致了舍入误差。 --- ## ✅ 示例:Python 中的浮点数误差 ```python a = 0.1 + 0.2 print(a) ``` 输出: ``` 0.30000000000000004 ``` 我们期望得到 `0.3`,但由于 `0.1` 和 `0.2` 无法用二进制浮点数精确表示,导致结果出现舍入误差。 --- ## ✅ 常见的舍入误差场景 1. **连续加法/减法**: ```python total = 0.0 for _ in range(10): total += 0.1 print(total) # 输出不是 1.0 ``` 2. **比较浮点数是否相等**: ```python a = 0.1 + 0.2 b = 0.3 print(a == b) # 输出 False ``` 3. **金融计算中的误差积累**: ```python price = 19.99 tax = price * 0.07 total = price + tax print(f"Total: {total:.2f}") # 可能输出 21.39 而不是 21.38 ``` --- ## ✅ 如何减少或避免舍入误差 ### ✅ 方法一:使用 `round()` 函数(适用于显示或输出) ```python a = 0.1 + 0.2 print(round(a, 2)) # 输出 0.3 ``` ### ✅ 方法二:使用 `decimal` 模块(高精度十进制计算,适合金融) ```python from decimal import Decimal a = Decimal('0.1') + Decimal('0.2') print(a) # 输出 Decimal('0.3') ``` ### ✅ 方法三:使用 `numpy.isclose()` 比较浮点数 ```python import numpy as np a = 0.1 + 0.2 b = 0.3 print(np.isclose(a, b)) # 输出 True ``` --- ## ✅ 总结:舍入误差的本质 - 计算机使用二进制表示浮点数,无法精确表示所有十进制小数 - 浮点数的精度有限(如 float64 有 52 位尾数) - 多次运算会导致误差积累 - 在关键场景(如金融、科学计算)中需要特别注意处理 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值