在Go语言中处理浮点数时,默认的打印方式往往不能满足业务上对小数位数的要求,尤其是涉及金额、比例等场景,通常需要固定保留两位小数。我们可以通过标准库中的fmt和strconv两个包来实现精确控制。

使用fmt包格式化输出
fmt包提供了类似C语言的格式化动词,其中%.2f表示将浮点数格式化为保留两位小数,会自动进行四舍五入。
package main
import (
"fmt"
)
func main() {
var price float64 = 19.987
// 使用%.2f保留两位小数
formatted := fmt.Sprintf("%.2f", price)
fmt.Println(formatted) // 输出 19.99
// 直接打印也可以
fmt.Printf("价格: %.2fn", price)
}
使用strconv包控制格式
如果希望更底层地控制小数位数和格式,可以使用strconv.FormatFloat函数,它允许指定格式类型和精度。
package main
import (
"strconv"
"fmt"
)
func main() {
var num float64 = 3.14159
// 'f'表示普通小数格式,-1表示使用最小必要位数,2表示小数精度
s := strconv.FormatFloat(num, 'f', 2, 64)
fmt.Println(s) // 输出 3.14
}
参数说明
- bitSize:传入float64就用64,float32用32
- prec:小数位数,这里填2即可保留两位
- fmt:'f'为十进制小数,'e'为科学计数法等
二者的区别与注意点
fmt的%.2f写法简单直观,适合大多数展示场景;strconv.FormatFloat更灵活,可被其他逻辑复用。需要注意的是,保留两位小数只是显示层处理,原浮点数值并未改变,若用于计算仍需注意精度问题。
浮点数的二进制表示可能导致微小误差,展示前格式化即可,不要依赖格式化后的字符串做后续运算。
常见错误
| 错误写法 | 说明 |
|---|---|
| fmt.Println(price) | 默认打印全部小数位,不可控 |
| 强制类型转换int(price*100)/100 | 截断而非四舍五入,且仍有精度风险 |
通过上述方式,我们就能在Go语言里稳定、清晰地控制浮点数输出格式,满足保留两位小数的需求。