用 fmt.Printf("%.2f%%", ratio*100) 输出百分比,需乘100并用%%转义;压缩比语义需明确:占原大小比例用 compressed/origin,减少比例用 1-compressed/origin;避免整数除法。

用 fmt.Printf 的 %.2f%% 格式直接输出百分比数值
Go 没有内置的“百分比类型”,压缩比本质是个 float64(比如 0.75 表示压缩后为原大小的 75%),要显示成 “75.00%” 这种形式,核心就是格式化小数并手动加百分号。最常用也最可靠的方式是用 fmt.Printf 配合 %.2f%%:
ratio := 0.7532
fmt.Printf("%.2f%%\n", ratio*100) // 输出:75.32%
注意两点:一是必须乘以 100(否则会输出 0.75%);二是 %% 是转义,表示字面量的 % 符号。不推荐用 fmt.Sprintf("%f%%", x*100) 然后手动截断小数位,容易出精度或舍入问题。
计算压缩比时别把分子分母搞反
压缩比常见歧义:有人指“压缩后 / 原始大小”(越小越好),也有人指“原始 / 压缩后”(越大越好,即压缩倍数)。Go 里你要先明确业务含义,再决定怎么算:
- 如果要显示“占用原体积的 X%”,用
float64(compressedSize) / float64(originalSize) - 如果要显示“压缩了 X%”,即减少比例,用
1 - float64(compressedSize)/float64(originalSize),再 ×100
例如原始 1000 字节,压缩后 320 字节:320.0/1000.0 = 0.32 → 输出 "32.00%" 表示“占原大小 32%”;而 1-0.32 = 0.68 → "68.00%" 表示“体积减少了 68%”。两者语义完全不同,但错误常出现在日志或监控里没写清楚单位。
避免整数除法导致结果为 0
如果直接写 必须显式转成浮点数: 如果只要整数(如 “75%” 而非 “75.32%”),别用 注意 真正容易被忽略的是:压缩比数值本身是否可信——比如文件系统缓存、I/O 误差、压缩算法元数据开销,都可能让 compressedSize / originalSize(两个都是 int),Go 会做整数除法,结果是 0(当 compressedSize 时)。这是新手最常踩的坑:originalSize, compressedSize := 1000, 320
ratio := compressedSize / originalSize // 结果是 0(int 除法)
fmt.Printf("%.2f%%\n", float64(ratio)*100) // 输出:0.00%
float64(compressedSize) / float64(originalSize)。哪怕其中一个已是 float64,另一个也得转,否则隐式转换规则不适用。需要四舍五入到整数百分比?用
math.Round
%.0f —— 它只是截断小数部分,不是四舍五入。正确做法是先用 math.Round 处理:import "math"
ratio := 0.756
pct := math.Round(ratio * 100) // 得到 76.0
fmt.Printf("%d%%\n", int(pct)) // 输出:76%
math.Round 在 Go 1.10+ 才有;旧版本可用 math.Floor(x + 0.5) 替代,但要注意负数场景(不过压缩比不会是负数,所以实际影响不大)。compressedSize 测量值偏小或偏大。格式化只是最后一步,前面的数据来源才决定输出有没有意义。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











