Python for循环输出重复内容问题的修复方法
问题根因
你遇到的输出重复问题,核心是浮点数二进制存储精度误差导致的:
步长0.1无法被二进制精确表示,np.arange(0,2.1,0.1)生成的t_max数组中,部分元素的实际存储值和理论值存在微小偏差,比如部分本应为0.8的值实际存储为0.7999999999999999。当你用t_max[j]+0.1作为np.arange的结束边界时,偶尔会因为这个微小偏差,导致结束边界实际没有达到下一个步长的阈值,np.arange生成的序列长度就和上一次循环的结果一致,进而出现重复输出。
修复方案
有两种常用的修复方式,都可以彻底解决重复问题:
- 方案1:全链路用整数计算,最后再做缩放,从根源避免浮点数精度问题
import numpy as np # 按0.1的倍率放大10倍,用整数生成序列再缩放回原尺度 t_max = np.arange(0, 21, 1) / 10 for j in range(2, len(t_max)): start = int(t_max[2] * 10) # 结束位置多补1个步长对应的整数单位 end = int(t_max[j] * 10) + 1 time = np.arange(start, end, 1) / 10 print(time)
- 方案2:给结束边界加一个极小的偏移量,抵消精度误差的影响
import numpy as np # 偏移量设置为远小于步长的极小值即可,这里步长0.1,用1e-8足够 offset = 1e-8 t_max = np.arange(0, 2.1, 0.1) for j in range(2, len(t_max)): time = np.arange(t_max[2], t_max[j] + 0.1 + offset, 0.1) print(time)
内容的提问来源于stack exchange,提问作者Horatio
相关产品推荐
相关产品推荐

