如何实现比较两个浮点数相似度并返回正确的共同近似值?
Python实现浮点数相似近似值的正确方法
需求说明
需要编写函数比较两个浮点数的相似性,返回二者近似到某一位后相等的最精确结果,具体要求:
- 输入
3.141593353533333和3.142222222222222→ 返回3.142 - 输入
3.14222和3.14159→ 返回3.142 - 输入
4.19999和4.19977→ 返回4.2
原代码问题分析
现有代码通过统计从左到右连续匹配的小数位来确定舍入位数,这是错误的核心原因:需求并非依赖连续相同的数字,而是要找到两个数舍入后相等的最高精度位数。比如前两个示例中,虽然前两位小数连续相同,但舍入到第三位时二者结果一致且更精确,这才是需要返回的结果。
解决方案
核心思路:从浮点数的最高有效精度(15位左右,符合Python浮点数的精度范围)开始,逐步降低舍入精度,找到第一个使两个数舍入后相等的位数,返回该结果。同时处理整数部分不同的情况,返回"-"。
代码实现
def lukuvertailu(a, b): # 整数部分不同直接返回"-" if int(a) != int(b): return "-" # 从高精度到低精度遍历舍入位数 max_decimals = 15 for decimal_places in range(max_decimals, -1, -1): rounded_a = round(a, decimal_places) rounded_b = round(b, decimal_places) if rounded_a == rounded_b: # 格式化结果,去除末尾多余的零和不必要的小数点 str_result = f"{rounded_a:.10f}".rstrip('0').rstrip('.') return float(str_result) if '.' in str_result else int(str_result) return "-"
测试验证
- 测试用例1:
lukuvertailu(3.141593353533333, 3.142222222222222)→ 输出3.142 - 测试用例2:
lukuvertailu(3.14222, 3.14159)→ 输出3.142 - 测试用例3:
lukuvertailu(4.19999, 4.19977)→ 输出4.2
内容的提问来源于stack exchange,提问作者TasH
相关产品推荐
相关产品推荐

