当前位置:首页 > 科技  > 软件

在Go中使用接口:实用性与脆弱性的平衡

来源: 责编: 时间:2024-02-04 09:02:12 281观看
导读在开发的初始阶段,我们经常会遇到“浮点数精度”和“货币值表示”的问题。那么,如何处理货币,如何存储和传递它们。为什么是问题?Go语言中的标准浮点类型具有一定的精度(像其他任何语言一样),你不能在货币操作中使用它们。这

在开发的初始阶段,我们经常会遇到“浮点数精度”和“货币值表示”的问题。IEp28资讯网——每日最新资讯28at.com

那么,如何处理货币,如何存储和传递它们。IEp28资讯网——每日最新资讯28at.com

为什么是问题?

Go语言中的标准浮点类型具有一定的精度(像其他任何语言一样),你不能在货币操作中使用它们。这里有一个最简单的例子:IEp28资讯网——每日最新资讯28at.com

var v1, v2 = 0.1, 0.2fmt.Println(v1 + v2)// 输出:0.30000000000000004

你可以计算你需要将一个值与另一个值相加多少次,才能在你的账户上获得额外的钱!但反过来也是一样 — 在这种情况下,你只是失去了你的钱。IEp28资讯网——每日最新资讯28at.com

这不仅在对你的钱进行数学运算时有问题,而且在不同系统或服务之间传递数据时也是有问题的。IEp28资讯网——每日最新资讯28at.com

下一个问题 — 传递你的钱

每次将你的钱从/到浮点数进行编组时,都会遇到与上述相同的问题,以及与编组器实现有关的其他问题 - json,xml,text等等...IEp28资讯网——每日最新资讯28at.com

另一个问题是四舍五入。如果你处理的是货币,你总会面临四舍五入的问题。你应该如何四舍五入你的货币值?例如 0.345 元,一般我们还是会四舍五入到 0.35 元?IEp28资讯网——每日最新资讯28at.com

我们的选择是什么?

有一些特殊的类型可用于货币的表示和计算。IEp28资讯网——每日最新资讯28at.com

Go标准库有 big.Float 类型(来自 math/big 包,表示任意精度的浮点数)。与 float32 和 float64 不同,它们具有固定的大小和精度,big.Float 允许你为数字和计算设置任意精度。IEp28资讯网——每日最新资讯28at.com

另一个不错的选择是 decimal 库 (https://github.com/shopspring/decimal)。IEp28资讯网——每日最新资讯28at.com

关于四舍五入:IEp28资讯网——每日最新资讯28at.com

  • 1.234 => 1.23
  • 1.235 => 1.24
  • 1.236 => 1.24

例如,shopspring/decimal 提供了适当舍入值的方法。IEp28资讯网——每日最新资讯28at.com

考虑的另一个好选择是使用货币单位。这样,你就从浮点数问题转移到整数,并将一切都作为整数计算。在这里唯一使用四舍五入的地方:传递结果值。IEp28资讯网——每日最新资讯28at.com

现在让我们讨论一下在传递货币时的选择。IEp28资讯网——每日最新资讯28at.com

  • 使用货币单位 — 我们将所有内容都传递为整数,这里没有浮点问题。只需控制值的限制,就可以了。
  • 将浮点数作为字符串传递。通常也是一个不错的选择 — 当你将浮点数作为字符串传递时,带有所需精度(特定小数位数)的字符串,当对方读取此字符串值并将其转换回浮点数时,你就是安全的。

简单的例子

你可以在 Go Playground 上尝试一下。IEp28资讯网——每日最新资讯28at.com

package mainimport (    "fmt"    "github.com/shopspring/decimal")func main() {    a := 0.1    b := 0.2    c := decimal.NewFromFloat(a)    d := decimal.NewFromFloat(b)    fmt.Println(a, b, c.String(), d.String())     fmt.Println(a + b)     fmt.Println(c.Add(d).String()) }

输出为:IEp28资讯网——每日最新资讯28at.com

0.1 0.2 0.1 0.20.300000000000000040.3

结论

处理货币时 — 使用 math/big 或一些与货币相关的库,比如 shopspring/decimal,或者只是使用货币单位,在这里不要使用浮点数。将货币作为字符串传递,或者在货币单位中传递,不要在这里使用浮点数。IEp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-72433-0.html在Go中使用接口:实用性与脆弱性的平衡

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 容器下在 Triton Server 中使用 TensorRT-LLM 进行推理

下一篇: Effect详解,你学会了吗?

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top