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
相关产品推荐
相关产品推荐

