外贸公司的网站怎么做,网站设计公司网站制作费用,如何阿里巴巴网站做推广,用五百丁做名字的简历网站在Go语言中#xff0c;没有内置的十进制数#xff08;decimal#xff09;类型或相关的标准库。然而#xff0c;有一些第三方包可用于处理十进制数#xff0c;其中比较常用的是decimal包。
decimal包提供了一个big.Float的子类型decimal.Decimal#xff0c;可以用于表示和…在Go语言中没有内置的十进制数decimal类型或相关的标准库。然而有一些第三方包可用于处理十进制数其中比较常用的是decimal包。
decimal包提供了一个big.Float的子类型decimal.Decimal可以用于表示和操作十进制数。它具有更高的精度和更大的范围可以处理任意精度的十进制数。
golang中的任意精度定点十进制数扩展包decimal。
demimal包特点:
零值为0无需初始化即可安全使用不损失精度的加法、减法、乘法以指定精度除法数据库/sql序列化/反序列化JSON 和 XML 序列化/反序列化
要使用decimal包首先需要确保已经安装了该包。你可以通过以下命令安装该包
一、安装方法:
go get github.com/shopspring/decimal二、安装要求
decimal包需要 Go 版本 1.7
三、使用方法
package mainimport (fmtgithub.com/shopspring/decimal
)func main() {price, err : decimal.NewFromString(136.02)if err ! nil {panic(err)}quantity : decimal.NewFromInt(3)fee, _ : decimal.NewFromString(.035)taxRate, _ : decimal.NewFromString(.08875)subtotal : price.Mul(quantity)preTax : subtotal.Mul(fee.Add(decimal.NewFromFloat(1)))total : preTax.Mul(taxRate.Add(decimal.NewFromFloat(1)))fmt.Println(Subtotal:, subtotal) // Subtotal: 408.06fmt.Println(Pre-tax:, preTax) // Pre-tax: 422.3421fmt.Println(Taxes:, total.Sub(preTax)) // Taxes: 37.482861375fmt.Println(Total:, total) // Total: 459.824961375fmt.Println(Tax rate:, total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875
}安装完成后你可以在你的Go代码中导入该包并使用decimal.Decimal类型。以下是一个简单的示例代码
package main import ( fmt gopkg.in/decimal.v1
) func main() { // 创建一个十进制数 d : decimal.New(12345, 2) // 12345精确到小数点后2位 // 输出十进制数的字符串表示 fmt.Println(d.String()) // 输出12.34 // 进行十进制数的四则运算 a : decimal.New(10, 0) // 整数10 b : decimal.New(20, 2) // 十进制数20.00 c : decimal.New(30, 2) // 十进制数30.00 d a.Add(b, c) // 加法运算 e : a.Sub(b, c) // 减法运算 f : a.Mul(b, c) // 乘法运算 g : a.Quo(b, c) // 除法运算 // 输出结果 fmt.Println(d.String()) // 输出31.00 fmt.Println(e.String()) // 输出-10.00 fmt.Println(f.String()) // 输出2200.00 fmt.Println(g.String()) // 输出0.50
}这个示例展示了如何创建十进制数、进行四则运算以及输出字符串表示。decimal包还提供了其他一些方法和函数你可以根据需要进一步探索和使用。
四、FAQ
为什么不直接使用 float64 呢
因为 float64实际上是任何二进制浮点类型无法精确表示 0.1 等数字。
你为什么不直接使用big.Rat呢
big.Rat 适合表示有理数但 Decimal 更适合表示金钱。 为什么 这是一个人为的示例
假设您使用 big.Rat并且有两个数字 x 和 y都代表 1/3并且 z 1 - x - y 1/3。 如果打印出每个数字则字符串输出必须在某个地方停止为简单起见假设它停止在 3 个小数位处因此您将得到 0.333、0.333 和 0.333。 但另外的0.001去哪儿了呢 对于 Decimal打印出来的字符串准确地表示数字。 因此如果 x y 1/3精度为 3它们实际上等于 0.333而当 z 1 - x - y 时z 将等于 0.334。 没有钱下落不明
你还是要小心。 如果你想将一个数字分成 N 3 种方式你不能只将 N/3 发送给三个不同的人。 您必须选择一个发送 N - (2/3*N) 给。 该人将收到剩余的一分钱的一小部分。
但是使用 Decimal 比使用 big.Rat 容易得多。
为什么 API 与 big.Int 的不相似
big.Int 的 API 旨在减少内存分配数量以实现最佳性能。 这对于它的用例来说是有意义的但代价是 API 很笨拙并且容易被误用。
例如要添加两个 big.Int您可以执行以下操作z : new(big.Int).Add(x, y)。 不熟悉此 API 的开发人员可能会尝试执行 z : a.Add(a, b)。 这会修改 a 并将 z 设置为 a 的别名这是他们意想不到的。 它还将任何其他别名修改为 a。
相比之下使用小数就很难犯这样的错误。 Decimal 的行为与其他 Go 数字类型类似即使 a b 不会将 b 深度复制到 a 中但也不可能修改 Decimal因为所有 Decimal 方法都会返回新的 Decimal并且不会修改原始的 Decimal。 缺点是这会导致额外的分配因此 Decimal 的性能较差。 我的假设是如果您使用小数您可能更关心正确性而不是性能。