decimal/math--数学运算
decimal加减乘除
初始化一个变量
d0 := decimal.NewFromFloat(0)
设置精度 为三位 四舍五入的精度
decimal.DivisionPrecision = 3
类型转换
var num1 float64 = 3.1
var num2 int = 2
d1 := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(float64(num2)))
//类型转换
fmt.Println(d1.IntPart())
fmt.Println(d1.String())
fmt.Println(d1.Abs())
加法 Add
加法 Add,int+float
初始化一个变量
d0 := decimal.NewFromFloat(0)
设置精度 为三位 四舍五入的精度
decimal.DivisionPrecision = 3
2.1 + 3 float和int相加
var num1 float64 = 2.1
var num2 int = 3
d1 := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "5.1"
加法 Add,float+float
2.1 + 3.1 (float和float相加)
var num1 float64 = 2.1
var num2 float64 = 3.1
d1 := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2))
fmt.Println(d1) // output: "5.2"
加法 Add,int+int
2 + 3 (int和int相加 可以直接相加)
var num1 float64 = 2
var num2 float64 = 3
(d1 = num1+num2)
d1 := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2))
fmt.Println(d1) // output: "5"
减法 Sub
减法 Sub,float-int相减
3.1 - 2 float和int相减
var num1 float64 = 3.1
var num2 int = 2
d1 := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "1.1"
减法 Sub,float-float相减
2.1 - 3.1 (float和float相减)
var num1 float64 = 2.1
var num2 float64 = 3.1
d1 := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(num2))
fmt.Println(d1) // output: "-1"
减法 Sub,int-int相减
2 - 3 (int和int相减)
var num1 int = 2
var num2 int = 3
(d1 = num1 - num2)
d1 := decimal.NewFromFloat(float64(num1)).Sub(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "-1"
乘法 Mul
乘法 Mul,float*int
3.1 * 2 float和int相乘
var num1 float64 = 3.1
var num2 int = 2
d1 := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "6.2"
乘法 Mul,float*float
2.1 * 3.1 (float和float相乘)
var num1 float64 = 2.1
var num2 float64 = 3.1
d1 := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(num2))
fmt.Println(d1) // output: "6.51"
乘法 Mul,int*int
2 * 3 (int和int相乘)
var num1 int = 2
var num2 int = 3
(d1 = num1 * num2)
d1 := decimal.NewFromFloat(float64(num1)).Mul(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "6"
除法 Div
除法 Div,int/int
int 和 int 相除
2 ➗ 3 = 0.6666666666666667
var num1 int = 2
var num2 int = 3
d1 := decimal.NewFromFloat(float64(num1)).Div(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "0.6666666666666667"
除法 Div,float64/int
float64 和 int 相除
var num1 float64 = 2.1
var num2 int = 3
d1 := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "0.7"
除法 Div,float64/float64
float64 和 float64 相除
2.1 ➗ 0.3 = 7
var num1 float64 = 2.1
var num2 float64 = 0.3
d2 := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(num2))
fmt.Println(d2) // output: "7"
除法 Div,int/int
int 和 int 相除 并保持3位精度
2 ➗ 3 = 0.667
var num1 int = 2
var num2 int = 3
decimal.DivisionPrecision = 3
d1 := decimal.NewFromFloat(float64(num1)).Div(decimal.NewFromFloat(float64(num2)))
fmt.Println(d1) // output: "0.667"
math数学计算
//math包中定义的常量
func main() {
fmt.Printf("float64的最大值是:%.f\n", math.MaxFloat64)
fmt.Printf("float64的最小值是:%.f\n", math.SmallestNonzeroFloat64)
fmt.Printf("float32的最大值是:%.f\n", math.MaxFloat32)
fmt.Printf("float32的最小值是:%.f\n", math.SmallestNonzeroFloat32)
fmt.Printf("Int8的最大值是:%d\n", math.MaxInt8)
fmt.Printf("Int8的最小值是:%d\n", math.MinInt8)
fmt.Printf("Uint8的最大值是:%d\n", math.MaxUint8)
fmt.Printf("Int16的最大值是:%d\n", math.MaxInt16)
fmt.Printf("Int16的最小值是:%d\n", math.MinInt16)
fmt.Printf("Uint16的最大值是:%d\n", math.MaxUint16)
fmt.Printf("Int32的最大值是:%d\n", math.MaxInt32)
fmt.Printf("Int32的最小值是:%d\n", math.MinInt32)
fmt.Printf("Uint32的最大值是:%d\n", math.MaxUint32)
fmt.Printf("Int64的最大值是:%d\n", math.MaxInt64)
fmt.Printf("Int64的最小值是:%d\n", math.MinInt64)
fmt.Printf("圆周率默认为:%.200f\n", math.Pi)
}
func main() {
/*
取绝对值,函数签名如下:
func Abs(x float64) float64
*/
fmt.Printf("[-3.14]的绝对值为:[%.2f]\n", math.Abs(-3.14))
/*
取x的y次方,函数签名如下:
func Pow(x, y float64) float64
*/
fmt.Printf("[2]的16次方为:[%.f]\n", math.Pow(2, 16))
/*
取余数,函数签名如下:
func Pow10(n int) float64
*/
fmt.Printf("10的[3]次方为:[%.f]\n", math.Pow10(3))
/*
取x的开平方,函数签名如下:
func Sqrt(x float64) float64
*/
fmt.Printf("[64]的开平方为:[%.f]\n", math.Sqrt(64))
/*
取x的开立方,函数签名如下:
func Cbrt(x float64) float64
*/
fmt.Printf("[27]的开立方为:[%.f]\n", math.Cbrt(27))
/*
向上取整,函数签名如下:
func Ceil(x float64) float64
*/
fmt.Printf("[3.14]向上取整为:[%.f]\n", math.Ceil(3.14))
/*
向下取整,函数签名如下:
func Floor(x float64) float64
*/
fmt.Printf("[8.75]向下取整为:[%.f]\n", math.Floor(8.75))
/*
取余数,函数签名如下:
func Floor(x float64) float64
*/
fmt.Printf("[10/3]的余数为:[%.f]\n", math.Mod(10, 3))
/*
分别取整数和小数部分,函数签名如下:
func Modf(f float64) (int float64, frac float64)
*/
Integer, Decimal := math.Modf(3.14159265358979)
fmt.Printf("[3.14159265358979]的整数部分为:[%.f],小数部分为:[%.14f]\n", Integer, Decimal)
}
封装方法
import (
calSymbol "github.com/FITLOSS/GoCalSymbol"
"github.com/shopspring/decimal"
)
// DecimalIntDiv 整型除
func DecimalIntDiv(a, b int64) decimal.Decimal {
aa := decimal.NewFromInt(a)
bb := decimal.NewFromInt(b)
return aa.Div(bb)
}
// DecimalIntAdd 整型加
func DecimalIntAdd(a, b int64) decimal.Decimal {
aa := decimal.NewFromInt(a)
bb := decimal.NewFromInt(b)
return aa.Add(bb)
}
// DecimalIntSub 整型减
func DecimalIntSub(a, b int64) decimal.Decimal {
aa := decimal.NewFromInt(a)
bb := decimal.NewFromInt(b)
return aa.Sub(bb)
}
// DecimalIntMul 整型乘
func DecimalIntMul(a, b int64) decimal.Decimal {
aa := decimal.NewFromInt(a)
bb := decimal.NewFromInt(b)
return aa.Mul(bb)
}
// MixCompute 公式计算 (加+减-乘*除/)
func MixCompute(formula string, nums map[rune]float64) float64 {
cal := calSymbol.NewStruct(len(formula) + 1)
cal.GiveRule(formula)
for s, f := range nums {
cal.Set(s, f)
}
return cal.Compute()
}
案例:
package main
import (
"fmt"
calSymbol "github.com/FITLOSS/GoCalSymbol"
)
func main() {
a, b, c := 1, 10, 3
d := MixCompute("(a+b)/c", map[rune]float64{
'a': float64(a),
'b': float64(b),
'c': float64(c),
})
fmt.Println(d)
}
func MixCompute(formula string, nums map[rune]float64) float64 {
cal := calSymbol.NewStruct(len(formula) + 1)
cal.GiveRule(formula)
for s, f := range nums {
cal.Set(s, f)
}
return cal.Compute()
}
选择了IT,必定终身学习