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()
}
posted @ 2023-10-06 21:22  Jeff的技术栈  阅读(156)  评论(0编辑  收藏  举报
回顶部