c语言编程笔录

首页 >   > 笔记大全

笔记大全

go语言中的decimal怎么使用

更新时间:2023-10-12

什么是decimal

Decimal是Go语言中一个高精度的数字类型,用于处理需要保持精确定度的数字。在计算机中,许多数据类型(如float和double)都无法完全精确地表示某些小数,Decimal就是为了解决这个问题而出现。

如何使用代码导入Decimal包

import "github.com/shopspring/decimal"

如何定义Decimal类型的变量

Decimal类型的变量可以使用字符串来初始化,也可以使用整型和浮点型等其他类型初始化,但是需要注意的是,在初始化时如果使用的是浮点型初始化Decimal变量,那么这个变量的值将失去精度,因此在处理需要高精度计算的场景中,建议使用字符串进行初始化。

import "github.com/shopspring/decimal"
func main() {
    var a,b,c decimal.Decimal
    a,_ = decimal.NewFromString("0.1")
    b = decimal.NewFromFloat(0.2)
    c = decimal.NewFromInt(10)
    fmt.Println(a,b,c) //输出:0.1 0.200000000000000011102230246251565404236316680908203125 10
}

Decimal类型的常用操作

加、减、乘、除、比较、取反操作
import "github.com/shopspring/decimal"
func main() {
    a,_ := decimal.NewFromString("0.1")
    b,_ := decimal.NewFromString("0.2")
    c,_ := decimal.NewFromString("3")
    //加法
    result := a.Add(b)
    fmt.Println(result) //输出:0.3
    //减法
    result = a.Sub(b)
    fmt.Println(result) //输出:-0.1
    //乘法
    result = a.Mul(b)
    fmt.Println(result) //输出:0.02
    //除法
    result = a.Div(b)
    fmt.Println(result) //输出:0.5
    //比较操作
    fmt.Println(a.Cmp(b)) //-1, a < b
    fmt.Println(a.Cmp(a)) //0, a = a
    fmt.Println(b.Cmp(a)) //1, b > a
    //取反操作
    fmt.Println(a.Neg()) //-0.1
}
取整操作

取整操作是Decimal类型中一个比较常见的操作,常用的有向上取整(向正无穷方向取整)、向下取整(向负无穷方向取整)和四舍五入取整。Decimal类型中提供了Round、Trunc、Ceil和Floor四个函数分别对应这几种取整操作。

import "github.com/shopspring/decimal"
func main() {
    a,_ := decimal.NewFromString("3.1415926535")
    //向上取整
    fmt.Println(a.Ceil()) //输出:4
    //向下取整
    fmt.Println(a.Floor()) //输出:3
    //四舍五入取整
    fmt.Println(a.Round(2)) //输出:3.14
}

总结

Decimal是Go语言中处理高精度数值计算的一个重要工具,通过Decimal类型的使用,我们可以避免在计算小数时出现精度丢失的问题,并且Decimal类型在Go语言的内置库中没有相关实现,因此,当遇到需要高精度计算的场景时,我们可以很方便的使用Decimal类型进行计算,并获得更高的准确性和稳定性。