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

Go语言中用%0.1f格式化浮点数为何舍入结果不一致?

Go中使用%0.1f格式化浮点数出现不一致舍入的原因

你碰到的情况是:用%0.1f格式化浮点数时,35.55被舍入为35.5,而25.55却被舍入为25.6,这不是Go的bug,根源在于浮点数的二进制存储精度限制。

核心原因

计算机里的float64(Go默认的浮点数类型)是用二进制存储的,很多十进制小数无法被二进制精确表示,只能存储为最接近的近似值:

  • 35.55实际存储的二进制值略小于十进制的35.55,近似为35.549999999999997
  • 25.55实际存储的二进制值略大于十进制的25.55,近似为25.550000000000001

fmt.Printf的%0.1f会基于这些实际存储的近似值做四舍五入:

  • 略小于35.55的数值,舍入到一位小数时会舍去末尾,得到35.5
  • 略大于25.55的数值,舍入到一位小数时会进位,得到25.6

验证实际存储值

你可以用更高精度的格式化来确认这些近似值:

package main

import "fmt"

func main() {
    fmt.Printf("35.55 实际存储值: %0.20f\n", 35.55)
    fmt.Printf("25.55 实际存储值: %0.20f\n", 25.55)
}

运行输出:

35.55 实际存储值: 35.54999999999999715783
25.55 实际存储值: 25.55000000000000106581

解决方案

如果需要精确的十进制舍入效果:

  1. 使用math.Round函数,先放大10倍取整再缩小:
    import "math"
    fmt.Printf("35.55 精确舍入结果: %0.1f\n", math.Round(35.55*10)/10) // 输出35.6
    fmt.Printf("25.55 精确舍入结果: %0.1f\n", math.Round(25.55*10)/10) // 输出25.6
    
  2. 涉及金融等对精度要求极高的场景,建议使用专门的十进制处理库,避免浮点数精度误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:35:25