侧边栏壁纸
博主头像
SeaDream乄造梦

Dream,Don't stop a day of hard and don't give up a little hope。 ——不停止一日努力&&不放弃一点希望。

  • 累计撰写 74 篇文章
  • 累计创建 21 个标签
  • 累计收到 14 条评论

目 录CONTENT

文章目录

数字运算精度丢失问题

SeaDream乄造梦
2025-01-08 / 0 评论 / 0 点赞 / 20 阅读 / 1,529 字
温馨提示:
亲爱的,如果觉得博主很有趣就留下你的足迹,并收藏下链接在走叭

数字运算精度丢失问题

decimal 库的优势
精度控制:decimal 类型支持设置精度和舍入模式,可以精确控制计算结果的精度。
避免浮动点误差:decimal 使用定点数表示,避免了浮动点数计算中的精度损失。
支持常见的财务运算:例如加、减、乘、除、取余等,并且能够按照特定规则进行舍入和格式化,适合财务、货币等领域。
支持大数运算:在处理大额金额时,decimal 能够保证准确的结果,适用于银行系统、财务软件等大规模的金额计算场景。

test

func TestMultiply(t *testing.T) {
	var five float64 = 500
	var six float64 = 6

	var fiveInt int64 = 500
	var sixInt int64 = 6

	fmt.Println(five / six * six)
	fmt.Println(fiveInt / sixInt * sixInt)
	fiveSixD := five / six
	fiveSixDMSix := fiveSixD * six

	fmt.Println(fiveSixD)
	fmt.Println(fiveSixDMSix)

	fiveSixDInt := fiveInt / sixInt
	fiveSixDMSixInt := fiveSixDInt * sixInt

	fmt.Println(fiveSixDInt)
	fmt.Println(fiveSixDMSixInt)

	//fiveSixD := math.DivideNum(five, six)
	//fiveSixDMSix := math.MultiplyNum(fiveSixD, six)

	fmt.Println(fiveSixDMSix)

}

// 测试2
func TestMultiply2(t *testing.T) {
	res := decimal.NewFromFloat(5).Div(decimal.NewFromFloat(6)).Mul(decimal.NewFromFloat(6))
	fmt.Println(res)
	fmt.Println(res.Truncate(2))
	fmt.Println(res.Round(2))
	a, _ := res.Float64()
	fmt.Println(a)
}

math.go

package math

import "github.com/shopspring/decimal"

// 分转换为元
func Divide(dividend float64) float64 {
	res, _ := decimal.NewFromFloat(dividend).Div(decimal.NewFromFloat(100)).Float64()
	return res
}

// 元转换为分 放大一百倍
func Multiply(multiplier float64) float64 {
	res, _ := decimal.NewFromFloat(multiplier).Mul(decimal.NewFromFloat(100)).Float64()
	return res
}

// 原子除
func DivideNum(dividend float64, num float64) float64 {
	res, _ := decimal.NewFromFloat(dividend).Div(decimal.NewFromFloat(num)).Float64()
	return res
}

func MultiplyNum(multiplier float64, num float64) float64 {
	res, _ := decimal.NewFromFloat(multiplier).Mul(decimal.NewFromFloat(num)).Float64()
	return res
}


0

评论区