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

Go语言:如何检测float64转float32时的精度损失

检测float64转float32的精度损失(高频执行场景)

场景:需要将接收的float64值转为float32通过网络发送,理论上所有输入都适配float32,但要记录转换时精度损失超标的情况。原代码因类型不匹配无法编译:

func convert(input float64) (output float32, err error) {
    const tolerance = 0.001
    output = float32(input)
    if output > input+tolerance || output < input-tolerance {
        return 0, errors.New("lost too much precision")
    }
    return output, nil
}

解决方案:统一类型后比较

最简便且高效的方式是把转换后的float32转回float64,再和原输入做数值比较,既解决了类型不兼容问题,又全程是数值运算,适合高频执行:

import "errors"

func convert(input float64) (output float32, err error) {
    const tolerance = 0.001
    output = float32(input)
    convertedBack := float64(output)
    
    diff := input - convertedBack
    if diff > tolerance || diff < -tolerance {
        return 0, errors.New("lost too much precision")
    }
    
    return output, nil
}

补充说明

  • 核心逻辑是类型对齐:将float32转回float64后,两者类型统一,可直接进行算术运算和比较。
  • 若不需要自定义容忍度,仅需检测是否存在任何精度损失,可简化判断:
    if float64(float32(input)) != input {
        // 存在精度损失
    }
    
    该判断会捕获所有微小精度丢失,适合对精度要求极高的场景。
  • 全程无字符串转换,运算开销极低,完全满足高频执行的性能需求。

内容的提问来源于stack exchange,提问作者Aristos Athens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:00:54