数字运算精度丢失问题
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
}
评论区