学校门户网站建设方案,服务器怎么设置ip做网站,枣庄做网站建设的公司,河北提供网站制作公司报价在开发的初始阶段#xff0c;我们经常会遇到“浮点数精度”和“货币值表示”的问题。
那么#xff0c;如何处理货币#xff0c;如何存储和传递它们。
为什么是问题#xff1f;
Go语言中的标准浮点类型具有一定的精度#xff08;像其他任何语言一样#xff09;#xf…在开发的初始阶段我们经常会遇到“浮点数精度”和“货币值表示”的问题。
那么如何处理货币如何存储和传递它们。
为什么是问题
Go语言中的标准浮点类型具有一定的精度像其他任何语言一样你不能在货币操作中使用它们。这里有一个最简单的例子
var v1, v2 0.1, 0.2
fmt.Println(v1 v2)
// 输出0.30000000000000004你可以计算你需要将一个值与另一个值相加多少次才能在你的账户上获得额外的钱但反过来也是一样 — 在这种情况下你只是失去了你的钱。 这不仅在对你的钱进行数学运算时有问题而且在不同系统或服务之间传递数据时也是有问题的。
下一个问题 — 传递你的钱
每次将你的钱从/到浮点数进行编组时都会遇到与上述相同的问题以及与编组器实现有关的其他问题 - jsonxmltext等等… 另一个问题是四舍五入。如果你处理的是货币你总会面临四舍五入的问题。你应该如何四舍五入你的货币值例如 0.345 元一般我们还是会四舍五入到 0.35 元
我们的选择是什么
有一些特殊的类型可用于货币的表示和计算。 Go标准库有 big.Float 类型来自 math/big 包表示任意精度的浮点数。与 float32 和 float64 不同它们具有固定的大小和精度big.Float 允许你为数字和计算设置任意精度。 另一个不错的选择是 decimal 库 github.com/shopspring/… 关于四舍五入
1.234 1.231.235 1.241.236 1.24
例如shopspring/decimal 提供了适当舍入值的方法。 考虑的另一个好选择是使用货币单位。这样你就从浮点数问题转移到整数并将一切都作为整数计算。在这里唯一使用四舍五入的地方:传递结果值。 现在让我们讨论一下在传递货币时的选择。
使用货币单位 — 我们将所有内容都传递为整数这里没有浮点问题。只需控制值的限制就可以了。将浮点数作为字符串传递。通常也是一个不错的选择 — 当你将浮点数作为字符串传递时带有所需精度特定小数位数的字符串当对方读取此字符串值并将其转换回浮点数时你就是安全的。
简单的例子
你可以在 Go Playground 上尝试一下。
package mainimport (fmtgithub.com/shopspring/decimal
)func main() {a : 0.1b : 0.2c : 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())
}
输出为
0.1 0.2 0.1 0.2
0.30000000000000004
0.3
结论
处理货币时 — 使用 math/big 或一些与货币相关的库比如 shopspring/decimal或者只是使用货币单位在这里不要使用浮点数。将货币作为字符串传递或者在货币单位中传递不要在这里使用浮点数。