You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现比较两个浮点数相似度并返回正确的共同近似值?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:28:17