找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1545

积分

0

好友

233

主题
发表于 3 天前 | 查看: 10| 回复: 0

在公积金贷款的自由还款方式下,每月需偿还的利息由贷款余额和当前年利率共同决定。例如,假设贷款余额为 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




上一篇:AI时代架构设计思维演进:从确定性系统到概率性协同
下一篇:UALink与UEC标准深度解析:重新定义AI集群GPU互联架构
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 20:53 , Processed in 0.409112 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表