
本文详解如何在 Go 语言中正确执行浮点除法运算,并使用格式化输出将结果精确控制在 4 位小数(自动四舍五入),避免整数除法导致的精度丢失。
本文详解如何在 Go 语言中正确执行浮点除法运算,并使用格式化输出将结果精确控制在 4 位小数(自动四舍五入),避免整数除法导致的精度丢失。
在 Go 中,int / int 运算默认执行整数除法,结果直接截断小数部分(非四舍五入),例如 190 / 13 得到 14,而非 14.6153...。若需保留小数精度,必须显式将操作数转换为浮点类型(如 float64),再进行运算,并通过 fmt.Printf 的动词格式控制输出精度。
✅ 正确做法:类型转换 + 格式化输出
核心修改仅两处:
- 将整数 q 和 w 转换为 float64 再相除:float64(q) / float64(w)
- 使用 fmt.Printf("%.4f\n", slope) 输出——%.4f 表示保留 4 位小数并自动四舍五入(不是截断)
以下是完整、健壮的修正代码:
package main
import (
"fmt"
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Insert y value: ")
if !scanner.Scan() {
fmt.Println("Error reading y")
return
}
yStr := scanner.Text()
fmt.Print("Insert x value: ")
if !scanner.Scan() {
fmt.Println("Error reading x")
return
}
xStr := scanner.Text()
y, err := strconv.Atoi(yStr)
if err != nil {
fmt.Printf("Invalid y input: %v\n", err)
return
}
x, err := strconv.Atoi(xStr)
if err != nil {
fmt.Printf("Invalid x input: %v\n", err)
return
}
if x == 0 {
fmt.Println("Error: division by zero")
return
}
slope := float64(y) / float64(x)
fmt.Printf("%.4f\n", slope) // 自动四舍五入至小数点后4位
}⚠️ 注意事项
- 不要复用同一 err 变量:原代码中两次 strconv.Atoi(...) 共享 err,后一次会覆盖前一次错误,导致无法准确判断哪个输入出错。应分别处理或使用新变量。
- 零除保护:务必检查除数是否为 0,否则运行时 panic。
- 输入扫描优化:使用单个 bufio.Scanner 更安全高效;多次创建 Scanner 可能因缓冲区竞争导致读取异常。
- %.4f 是四舍五入(rounding),非截断(truncation)。例如 190.0/13.0 = 14.615384... → 输出 14.6154(第5位是8,进位)。
✅ 验证示例
输入:
Insert y value: 190 Insert x value: 13
输出:
14.6154
该方案简洁、安全、符合 Go 最佳实践,适用于所有需要高精度商值显示的场景。