0

0

在 Golang 和其他编程语言中处理货币

王林

王林

发布时间:2024-07-10 16:19:24

|

800人浏览过

|

来源于dev.to

转载

在 golang 和其他编程语言中处理货币

用编程语言处理货币是软件开发的一个重要方面,特别是对于处理金融交易、电子商务、银行和会计系统的应用程序。货币价值的准确表示和操纵对于避免可能导致重大财务差异的错误至关重要。

本文将以 Go 语言为例探讨处理货币的最佳实践。

精度和准确度

处理货币时最关心的问题之一是准确性。与可能引入舍入误差的浮点数不同,货币值需要精确的表示。

考虑以下代码

包主

导入“fmt”

函数主() {

    var a float64 = 1.1
    var b float64 = 1.2
    var c float64 = 1.3
    fmt.Println(a + b + c)

}

上面的代码将打印

3.5999999999999996

由于计算机的内存有限,大多数编程语言(包括 Go)都使用 32 或 64 位存储基于 IEEE-754 标准的浮点数,即使使用 64 位精度也不可能存储无限多个数字,这意味着这些数字是在某个点进行四舍五入,使它们本质上不精确,并且执行的计算越多,它们变得越不精确。

立即学习go语言免费学习笔记(深入)”;

有很多方法可以处理这个问题,例如使用第 3 方库或您使用的编程语言具有本机支持。 在 Go 中,有几个库,包括:

  • shopspring/十进制
  • ericlagergren/十进制
  • alpacahq/alpacadecimal
  • 转到值/小数

感谢 kennfatt 策划了这个图书馆列表

选择图书馆

选择正确的库来处理货币编程需要考虑几个因素。这是一个指南,可帮助您选择适合您需求的十进制库

1. 准确度和精密度

确保库支持精度和准确性满足您的要求。如果处理非常大的数字或非常精确的计算,请寻找任意精度的功能。

2. 易于使用

图书馆应该有清晰、全面的文档。它应该很容易与您现有的代码库和工作流程集成。

3. 性能

考虑性能影响,尤其是当您执行大量计算或在高频交易环境中操作时。

4. 特点

确保功能满足您的需求,从舍入、加法、减法、乘法、除法等基本算术到更复杂的数学运算。

5. 社区和支持

支持良好的库和活跃的社区对于获得帮助和找到问题的解决方案至关重要。 寻找积极维护和更新的库。

Android中JNI编程的那些事儿 中文WORD版
Android中JNI编程的那些事儿 中文WORD版

本文档主要讲述的是Android中JNI编程的那些事儿;JNI译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在android中提供JNI的方式,让Java程序可以调用C语言程序。android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

使用第 3 方

本文将使用第三方库 govalues/decimal 作为代码示例,因为文档简单易读,适合代码演示的需要

包主

进口 (
    “FMMT”
    “github.com/govalues/decimal”
)

函数主() {

    a, _ := 小数.Parse("1.1")
    b, _ := 小数.Parse("1.2")
    c, _ := 小数.Parse("1.3")

    a, _ = a.Add(b)
    a, _ = a.Add(c)
    fmt.Println(a.String())

}

上面的代码将打印

3.6

上面的例子没有精度损失,但由于内存是有成本的,而且不是无限的,小数点后的位数仍然有限,控制小数位数很重要,在这个例子中你可以使用decimal.ParseExact()设置大小

存储和检索

存储在数据库中也需要仔细考虑以保持精度和一致性。

使用适当的列类型

大多数关系数据库都有特定的货币值类型,例如 DECIMAL 或 NUMERIC。

避免浮点存储

就像编程一样,避免将货币值作为浮点数存储在数据库中。

例如在 MySQL 中

创建表`用户`(
    `id` int,
    `余额` 小数(6, 2)
);

go 中完整的 MySQL 演示

包主

进口 (
    “数据库/sql”
    _“github.com/go-sql-driver/mysql”
)

函数主() {

    db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test")
    如果错误!= nil {
        恐慌(错误)
    }

    _, 错误 = db.Exec(`
        创建表测试(
            id 整数,
            Balance_decimal 小数(16, 8),
            平衡浮点 (16, 8),
            主键(id)
        );
    `)

    _, err = db.Exec("INSERT INTO test (id,balance_decimal,balance_float) VALUES (1, 1.1, 1.1)")
    _, 错误 = db.Exec(`
        更新测试 
            放 
                余额小数 = 余额小数 + 1.2 , 
                浮动余额 = 浮动余额 + 1.2 
            其中 ID = 1;
    `)
}

上面的代码会产生

id balance_decimal balance_float
1 2.30000000 2.29999995

数据传输

数据传输也需要仔细考虑精度。需要正确的格式

例如在 JSON 格式中,使用字符串类型可以保证任何编程语言的精度

包主

进口 (
    “编码/json”
    “日志”
)

类型数据结构{
    十进制字符串 `json:"decimal"`
    浮点 float64 `json:"float"`
}

函数主() {

    有效负载 := []byte(`{"十进制":"999.99999999999999","浮点":999.99999999999999}`)

    结果:=数据{}

    _ = json.Unmarshal(有效负载, &结果)

    log.Print("小数:", result.Decimal)
    log.Print("浮点数:", result.Float)

}

上面的代码将打印

十进制:999.99999999999999
浮动:1000

结论

用编程语言处理货币需要仔细注意细节,以确保精度、准确性和一致性。通过使用适当的数据类型、库和最佳实践,开发人员可以避免常见的陷阱并确保他们的应用程序正确处理货币。正确处理货币不仅可以防止财务错误,还可以增强用户对应用程序的信任和信心。

没有一个适合所有人的最佳库。每个项目都有不同的需求。您应该根据您的项目需求来考虑每个库的优点和缺点。

外部链接

  • 完整代码示例
  • govalues/decimal 仓库
  • shopspring/decimal 仓库
  • ericlagergren/十进制回购
  • alpacahq/alpacadecimal 仓库

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号