在公积金贷款的自由还款方式下,每月需偿还的利息由贷款余额和当前年利率共同决定。例如,假设贷款余额为 10000 元,年利率为 3.325%,则当月利息为:10000 × 3.325% ÷ 12 ≈ 27.7 元。
利用 Go 语言高效简洁的特性,我们可以快速编写一个命令行工具,只需传入贷款余额和年利率,即可快速计算并输出结果,简化财务规划过程。
一、读取命令行参数
在Go中,os.Args 是一个字符串切片,用于存储程序启动时传入的所有命令行参数。
例如,编译程序为 interest 后,执行命令 ./interest 10000 3.325。此时:
os.Args[0] 为程序名 ./interest
os.Args[1] 为第一个参数 "10000"
os.Args[2] 为第二个参数 "3.325"
我们将 os.Args[1] 视为贷款余额(balance),将 os.Args[2] 视为年利率(rate,不含百分号)。
二、字符串参数转换为浮点数
从命令行获取的参数是字符串类型,必须将其转换为浮点数才能进行数学运算。Go语言的 strconv 包提供了类型转换功能。
可以使用 strconv.ParseFloat 函数进行转换,该函数返回转换后的浮点数值和一个可能的错误。进行健壮的错误处理是编写可靠命令行工具的重要基础。
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
if len(os.Args) < 3 {
fmt.Println("用法: ./interest <贷款余额> <年利率>")
os.Exit(1)
}
balanceStr := os.Args[1]
rateStr := os.Args[2]
balance, err := strconv.ParseFloat(balanceStr, 64)
if err != nil {
fmt.Printf("‘贷款余额’参数解析错误: %v\n", err)
os.Exit(1)
}
rate, err := strconv.ParseFloat(rateStr, 64)
if err != nil {
fmt.Printf("‘年利率’参数解析错误: %v\n", err)
os.Exit(1)
}
// ... 后续计算
}
三、计算并格式化输出
利息计算公式为:月利息 = 贷款余额 × 年利率 ÷ 100 ÷ 12。
计算完成后,直接输出可能会产生过多小数位。在金融计算中,货币金额通常保留两位小数,利率可保留更多位以保持精度。
// 接续上面的代码
monthlyInterest := balance * rate / 100 / 12
fmt.Printf("贷款余额: %.2f 元\n", balance)
fmt.Printf("年利率: %.3f%%\n", rate)
fmt.Printf("当月利息: %.2f 元\n", monthlyInterest)
使用 Printf 配合格式化动词 %.2f 和 %.3f,可以分别控制输出保留两位或三位小数。
四、功能拓展:支持利率调整对比
考虑到未来利率可能调整,我们可以扩展程序功能,使其支持输入一个新的对比利率,并计算利息差额。
为了避免主函数逻辑过于复杂,我们将参数解析和利息计算提取为独立函数。
func parseArg(arg string, argName string) (float64, error) {
val, err := strconv.ParseFloat(arg, 64)
if err != nil {
return 0, fmt.Errorf("‘%s’参数解析错误: %w", argName, err)
}
return val, nil
}
func calculateInterest(balance, rate float64) float64 {
return balance * rate / 100 / 12
}
重构后,main 函数逻辑变得非常清晰,并且易于增加新功能,例如支持可选的第三个参数(新利率)。
func main() {
if len(os.Args) < 3 {
fmt.Println("用法: ./interest <贷款余额> <年利率> [对比年利率]")
os.Exit(1)
}
balance, err := parseArg(os.Args[1], “贷款余额”)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
oldRate, err := parseArg(os.Args[2], “年利率”)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
oldInterest := calculateInterest(balance, oldRate)
fmt.Printf("当前年利率 %.3f%% 下,当月利息为: %.2f 元\n", oldRate, oldInterest)
// 如果提供了第三个参数(新利率),则计算对比
if len(os.Args) == 4 {
newRate, err := parseArg(os.Args[3], “对比年利率”)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
newInterest := calculateInterest(balance, newRate)
diff := newInterest - oldInterest
fmt.Printf("调整后年利率 %.3f%% 下,当月利息为: %.2f 元\n", newRate, newInterest)
if diff > 0 {
fmt.Printf("利息将增加: %.2f 元\n", diff)
} else if diff < 0 {
fmt.Printf("利息将减少: %.2f 元\n”, -diff)
} else {
fmt.Println(“利息无变化”)
}
}
}
现在,程序可以处理两种调用方式:
./interest 100000 3.325 (仅计算当前利率下的利息)
./interest 100000 3.325 3.1 (计算利率从3.325%调整为3.1%后的利息变化)
五、编译与使用
使用 go build 命令将程序编译为可执行文件。
go build -o interest main.go
之后便可在命令行中直接运行 ./interest 并使用不同参数进行测试。
本文的完整代码实现,可通过以下仓库获取:
https://gitee.com/codeman2026/monthly-interest-calculator