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

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

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

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

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

为什么是问题?

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

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

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

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

下一个问题 — 传递你的钱

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

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

我们的选择是什么?

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

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

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

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

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

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

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

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

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

简单的例子

你可以在 Go Playground 上尝试一下。ujh28资讯网——每日最新资讯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()) }

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

0.1 0.2 0.1 0.20.300000000000000040.3

结论

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

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

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

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

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

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top