# Mathutil mathutil 包实现了一些数学计算的函数.
## 源码: - [https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go](https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go)
## 用法: ```go import ( "github.com/duke-git/lancet/v2/mathutil" ) ```
## 目录 - [Average](#Average) - [Exponent](#Exponent) - [Fibonacci](#Fibonacci) - [Factorial](#Factorial) - [Max](#Max) - [MaxBy](#MaxBy) - [Min](#Min) - [MinBy](#MaxBy) - [Percent](#Percent) - [RoundToFloat](#RoundToFloat) - [RoundToString](#RoundToString) - [TruncRound](#TruncRound) - [Range](#Range) - [RangeWithStep](#RangeWithStep) - [AngleToRadian](#AngleToRadian) - [RadianToAngle](#RadianToAngle) - [PointDistance](#PointDistance) - [IsPrime](#IsPrime) - [GCD](#GCD) - [LCM](#LCM) - [Cos](#Cos) - [Sin](#Sin) - [Log](#Log) - [Sum](#Sum) - [Abs](#Abs)
## 文档 ### Average

计算平均数. 可能需要对结果调用RoundToFloat方法四舍五入

函数签名: ```go func Average[T constraints.Integer | constraints.Float](numbers ...T) T ``` 示例:[运行](https://go.dev/play/p/HFd70x4DrMj) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Average(1, 2) avg := mathutil.Average(1.2, 1.4) result2 := mathutil.RoundToFloat(avg, 1) fmt.Println(result1) fmt.Println(result2) // Output: // 1 // 1.3 } ``` ### Exponent

指数计算(x的n次方)

函数签名: ```go func Exponent(x, n int64) int64 ``` 示例:[运行](https://go.dev/play/p/Vv7LBwER-pz) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Exponent(10, 0) result2 := mathutil.Exponent(10, 1) result3 := mathutil.Exponent(10, 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 1 // 10 // 100 } ``` ### Fibonacci

计算斐波那契数列的第n个数

函数签名: ```go func Fibonacci(first, second, n int) int ``` 示例:[运行](https://go.dev/play/p/IscseUNMuUc) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Fibonacci(1, 1, 1) result2 := mathutil.Fibonacci(1, 1, 2) result3 := mathutil.Fibonacci(1, 1, 5) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 1 // 1 // 5 } ``` ### Factorial

计算阶乘

函数签名: ```go func Factorial(x uint) uint ``` 示例:[运行](https://go.dev/play/p/tt6LdOK67Nx) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Factorial(1) result2 := mathutil.Factorial(2) result3 := mathutil.Factorial(3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 1 // 2 // 6 } ``` ### Max

返回参数中的最大数

函数签名: ```go func Max[T constraints.Integer | constraints.Float](numbers ...T) T ``` 示例:[运行](https://go.dev/play/p/cN8DHI0rTkH) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Max(1, 2, 3) result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4) fmt.Println(result1) fmt.Println(result2) // Output: // 3 // 1.4 } ``` ### MaxBy

使用给定的比较器函数返回切片的最大值

函数签名: ```go func MaxBy[T any](slice []T, comparator func(T, T) bool) T ``` 示例:[运行](https://go.dev/play/p/pbe2MT-7DV2) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool { return len(v1) > len(v2) }) result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool { return len(v1) > len(v2) }) result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool { return len(v1) > len(v2) }) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // abc // abd // } ``` ### Min

返回参数中的最小数

函数签名: ```go func Min[T constraints.Integer | constraints.Float](numbers ...T) T ``` 示例:[运行](https://go.dev/play/p/pbe2MT-7DV2) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Min(1, 2, 3) result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4) fmt.Println(result1) fmt.Println(result2) // Output: // 1 // 1.1 } ``` ### MinBy

使用给定的比较器函数返回切片的最小值

函数签名: ```go func MinBy[T any](slice []T, comparator func(T, T) bool) T ``` 示例:[运行](https://go.dev/play/p/N9qgYg_Ho6f) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool { return len(v1) < len(v2) }) result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool { return len(v1) < len(v2) }) result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool { return len(v1) < len(v2) }) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // a // ab // } ``` ### Percent

计算百分比,保留n位小数

函数签名: ```go func Percent(val, total float64, n int) float64 ``` 示例:[运行](https://go.dev/play/p/s0NdFCtwuyd) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Percent(1, 2, 2) result2 := mathutil.Percent(0.1, 0.3, 2) result3 := mathutil.Percent(-30305, 408420, 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 50 // 33.33 // -7.42 } ``` ### RoundToFloat

四舍五入,保留n位小数

函数签名: ```go func RoundToFloat(x float64, n int) float64 ``` 示例:[运行](https://go.dev/play/p/ghyb528JRJL) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.RoundToFloat(0.124, 2) result2 := mathutil.RoundToFloat(0.125, 2) result3 := mathutil.RoundToFloat(0.125, 3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 0.12 // 0.13 // 0.125 } ``` ### RoundToString

四舍五入,保留n位小数,返回字符串

函数签名: ```go func RoundToString(x float64, n int) string ``` 示例:[运行](https://go.dev/play/p/kZwpBRAcllO) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.RoundToString(0.124, 2) result2 := mathutil.RoundToString(0.125, 2) result3 := mathutil.RoundToString(0.125, 3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 0.12 // 0.13 // 0.125 } ``` ### TruncRound

截短n位小数(不进行四舍五入)

函数签名: ```go func TruncRound(x float64, n int) float64 ``` 示例:[运行](https://go.dev/play/p/aumarSHIGzP) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.TruncRound(0.124, 2) result2 := mathutil.TruncRound(0.125, 2) result3 := mathutil.TruncRound(0.125, 3) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 0.12 // 0.12 // 0.125 } ``` ### Range

根据指定的起始值和数量,创建一个数字切片。

函数签名: ```go func Range[T constraints.Integer | constraints.Float](start T, count int) []T ``` 示例:[运行](https://go.dev/play/p/9ke2opxa8ZP) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Range(1, 4) result2 := mathutil.Range(1, -4) result3 := mathutil.Range(-4, 4) result4 := mathutil.Range(1.0, 4) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) // Output: // [1 2 3 4] // [1 2 3 4] // [-4 -3 -2 -1] // [1 2 3 4] } ``` ### RangeWithStep

根据指定的起始值,结束值,步长,创建一个数字切片。

函数签名: ```go func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T ``` 示例:[运行](https://go.dev/play/p/akLWz0EqOSM) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.RangeWithStep(1, 4, 1) result2 := mathutil.RangeWithStep(1, -1, 0) result3 := mathutil.RangeWithStep(-4, 1, 2) result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) // Output: // [1 2 3] // [] // [-4 -2 0] // [1 2.1 3.2] } ``` ### AngleToRadian

将角度值转为弧度值

函数签名: ```go func AngleToRadian(angle float64) float64 ``` 示例:[运行](https://go.dev/play/p/CIvlICqrHql) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.AngleToRadian(45) result2 := mathutil.AngleToRadian(90) result3 := mathutil.AngleToRadian(180) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 0.7853981633974483 // 1.5707963267948966 // 3.141592653589793 } ``` ### RadianToAngle

将弧度值转为角度值

函数签名: ```go func RadianToAngle(radian float64) float64 ``` 示例:[运行](https://go.dev/play/p/dQtmOTUOMgi) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.RadianToAngle(math.Pi) result2 := mathutil.RadianToAngle(math.Pi / 2) result3 := mathutil.RadianToAngle(math.Pi / 4) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 180 // 90 // 45 } ``` ### PointDistance

计算两个坐标点的距离

函数签名: ```go func PointDistance(x1, y1, x2, y2 float64) float64 ``` 示例:[运行](https://go.dev/play/p/RrG4JIaziM8) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.PointDistance(1, 1, 4, 5) fmt.Println(result1) // Output: // 5 } ``` ### IsPrime

判断质数。

函数签名: ```go func IsPrime(n int) bool ``` 示例:[运行](https://go.dev/play/p/Rdd8UTHZJ7u) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.IsPrime(-1) result2 := mathutil.IsPrime(0) result3 := mathutil.IsPrime(1) result4 := mathutil.IsPrime(2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) // Output: // false // false // false // true } ``` ### GCD

计算最大公约数。

函数签名: ```go func GCD[T constraints.Integer](integers ...T) T ``` 示例:[运行](https://go.dev/play/p/CiEceLSoAKB) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.GCD(1, 1) result2 := mathutil.GCD(1, -1) result3 := mathutil.GCD(-1, 1) result4 := mathutil.GCD(-1, -1) result5 := mathutil.GCD(3, 6, 9) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) // Output: // 1 // 1 // -1 // -1 // 3 } ``` ### LCM

计算最小公倍数。

函数签名: ```go func LCM[T constraints.Integer](integers ...T) T ``` 示例:[运行](https://go.dev/play/p/EjcZxfY7G_g) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.LCM(1, 1) result2 := mathutil.LCM(1, 2) result3 := mathutil.LCM(3, 6, 9) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 1 // 2 // 18 } ``` ### Cos

计算弧度的余弦值

函数签名: ```go func Cos(radian float64, precision ...int) float64 ``` 示例:[运行](https://go.dev/play/p/Sm89LoIfvFq) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Cos(0) result2 := mathutil.Cos(90) result3 := mathutil.Cos(180) result4 := mathutil.Cos(math.Pi) result5 := mathutil.Cos(math.Pi / 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) // Output: // 1 // -0.447 // -0.598 // -1 // 0 } ``` ### Sin

计算弧度的正弦值

函数签名: ```go func Sin(radian float64, precision ...int) float64 ``` 示例:[运行](https://go.dev/play/p/TWMQlMywDsP) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Sin(0) result2 := mathutil.Sin(90) result3 := mathutil.Sin(180) result4 := mathutil.Sin(math.Pi) result5 := mathutil.Sin(math.Pi / 2) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) fmt.Println(result4) fmt.Println(result5) // Output: // 0 // 0.894 // -0.801 // 0 // 1 } ``` ### Log

计算以base为底n的对数。

函数签名: ```go func Log(n, base float64) float64 ``` 示例:[运行](https://go.dev/play/p/_d4bi8oyhat) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Log(8, 2) result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2) result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 3 // 2.32 // 3 } ``` ### Sum

求传入参数之和。

函数签名: ```go func Sum[T constraints.Integer | constraints.Float](numbers ...T) T ``` 示例:[运行](https://go.dev/play/p/1To2ImAMJA7) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := mathutil.Sum(1, 2) result2 := mathutil.Sum(0.1, float64(1)) fmt.Println(result1) fmt.Println(result2) // Output: // 3 // 1.1 } ``` ### Abs

求绝对值。

函数签名: ```go func Abs[T constraints.Integer | constraints.Float](x T) T ``` 示例:[运行](https://go.dev/play/p/fsyBh1Os-1d) ```go package main import ( "fmt" "github.com/duke-git/lancet/v2/mathutil" ) func main() { result1 := Abs(-1) result2 := Abs(-0.1) result3 := Abs(float32(0.2)) fmt.Println(result1) fmt.Println(result2) fmt.Println(result3) // Output: // 1 // 0.1 // 0.2 } ```