go decimal 使用方法

本文介绍了如何在Go中导入和使用github.com/shopspring/decimal包进行高精度浮点数运算,包括结构定义、转换及加减乘除等操作,确保在前端传参和计算过程中避免精度损失。

一、载入decimal包

     go get  github.com/shopspring/decimal

二、结构定义

注意:前端传参转成包含decimal的结构时,建议使用 json.Unmarshal(xx, &buyGoods{})  

import (
    "github.com/shopspring/decimal"
)
// 购买商品
type buyGoods struct {
    Num          int             `json:"num"`          // 数量',
    Price        decimal.Decimal `json:"price"`        // 单价'
}

三、逻辑使用

// 先将int 转成string 再转成 decimal类型去运算
sellNum, _ := decimal.NewFromString(strconv.Itoa(e.Num)) 
totalMoney := MulDecimal(e.Price, sellNum)

四、对应decimal的运算方法

import "github.com/shopspring/decimal"

// 主要用于处理浮点数据精度

// 加法
func AddDecimal(d1 decimal.Decimal, d2 decimal.Decimal) decimal.Decimal {
    return d1.Add(d2)
}

// 减法
func SubDecimal(d1 decimal.Decimal, d2 decimal.Decimal) decimal.Decimal {
    return d1.Sub(d2)
}

// 乘法
func MulDecimal(d1 decimal.Decimal, d2 decimal.Decimal) decimal.Decimal {
    return d1.Mul(d2)
}

// 除法
func DivDecimal(d1 decimal.Decimal, d2 decimal.Decimal) decimal.Decimal {
    return d1.Div(d2)
}

// int
func IntDecimal(d decimal.Decimal) int64 {
    return d.IntPart()
}

// float
func FloatDecimal(d decimal.Decimal) float64 {
    f, exact := d.Float64()
    if !exact {
        return f
    }
    return 0
}
### Go语言中使用decimal库进行高精度计算的方法Go语言中,`decimal` 库提供了一种高性能、任意精度的十进制浮点数运算解决方案。以下是关于如何使用 `decimal` 库进行高精度计算的详细说明。 #### 1. 安装 `decimal` 库 首先需要安装 `decimal` 库。可以通过以下命令安装: ```bash go get github.com/shopspring/decimal ``` #### 2. 导入库 在代码中导入 `decimal` 库: ```go import "github.com/shopspring/decimal" ``` #### 3. 创建 Decimal 类型变量 `decimal.Decimal` 是该库的核心类型,用于表示高精度的十进制数值。可以通过多种方式创建 `Decimal` 变量: - 使用字符串初始化: ```go value := decimal.NewFromFloat(0.1) // 从浮点数创建 valueStr := decimal.NewFromString("0.1") // 从字符串创建 [^3] ``` - 使用整数和小数部分初始化: ```go valueInt := decimal.New(1, -1) // 表示 1 * 10^-1 = 0.1 ``` #### 4. 基本运算 `decimal` 库支持常见的数学运算,包括加法、减法、乘法和除法等。这些运算通过方法调用实现: - 加法: ```go result := value.Add(decimal.NewFromFloat(0.2)) // 结果为 0.3 ``` - 减法: ```go result := value.Sub(decimal.NewFromFloat(0.2)) // 结果为 -0.1 ``` - 乘法: ```go result := value.Mul(decimal.NewFromFloat(2)) // 结果为 0.2 ``` - 除法: ```go result := value.Div(decimal.NewFromFloat(2)) // 结果为 0.05 ``` #### 5. 精度控制 `decimal` 库允许用户设置结果的小数位数,从而控制精度。可以使用 `Round` 方法对结果进行四舍五入: ```go rounded := result.Round(2) // 将结果保留两位小数 ``` #### 6. 转换与格式化 `decimal` 支持与其他数据类型的转换和格式化输出: - 转换为字符串: ```go strValue := result.String() // 转换为字符串表示 ``` - 转换为浮点数(注意可能丢失精度): ```go floatValue := result.InexactFloat64() // 转换为 float64 ``` - 格式化输出: ```go formatted := result.Text('f', 2) // 以固定小数位格式输出 ``` #### 7. 比较操作 由于浮点数存储的不精确性[^3],直接比较浮点数可能会导致错误。`decimal` 提供了安全的比较方法: - 判断是否相等: ```go isEqual := value.Equal(decimal.NewFromFloat(0.1)) ``` - 比较大小: ```go isGreater := value.GreaterThan(decimal.NewFromFloat(0.05)) isLess := value.LessThan(decimal.NewFromFloat(0.2)) ``` #### 8. 高级功能 `decimal` 还提供了其他高级功能,例如指数运算、取模运算等。这些功能适用于更复杂的科学计算场景。 - 指数运算: ```go expResult := value.Exp() // 计算 e^value ``` - 取模运算: ```go modResult := value.Mod(decimal.NewFromFloat(0.1)) // 计算余数 ``` ### 示例代码 以下是一个完整的示例,展示如何使用 `decimal` 库进行高精度计算: ```go package main import ( "fmt" "github.com/shopspring/decimal" ) func main() { // 初始化 Decimal 变量 value1, _ := decimal.NewFromString("0.1") value2, _ := decimal.NewFromString("0.2") // 加法 sum := value1.Add(value2) fmt.Println("Sum:", sum) // 减法 diff := value1.Sub(value2) fmt.Println("Difference:", diff) // 乘法 product := value1.Mul(value2) fmt.Println("Product:", product) // 除法 quotient := value1.Div(value2) fmt.Println("Quotient:", quotient) // 四舍五入 rounded := sum.Round(2) fmt.Println("Rounded:", rounded) // 比较 isEqual := value1.Equal(value2) fmt.Println("Is Equal:", isEqual) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值