math 库中常用的数学运算和常量【GO 基础】

〇、关于 math

GO 语言的 math 库是一个内置的标准库,其中包含了许多数学函数和常量,用于计算各种数学运算和统计学计算。

日常开发中,计算当然是少不了的,那么今天来梳理下备查。

一、测试示例

1.1 小数位的:Round-四舍五入、RoundToEven-四舍/五至偶数

func Round(x float64 ) float64func RoundToEven(x float64 ) float64

如下测试代码和结果:

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Printf("math.Round(3.4):%v\n", math.Round(3.4))
	fmt.Printf("math.Round(3.5):%v\n", math.Round(3.5))
	fmt.Printf("math.Round(3.6):%v\n", math.Round(3.6))
	// fmt.Printf("math.RoundToEven(3.5): %f\n", math.RoundToEven(3.4))
	// fmt.Printf("math.RoundToEven(4.5): %f\n", math.RoundToEven(4.4))
	fmt.Printf("math.RoundToEven(3.5): %f\n", math.RoundToEven(3.5))
	fmt.Printf("math.RoundToEven(4.5): %f\n", math.RoundToEven(4.5))
	// %f 输出精度格式:%总位数.小数位数f  // 默认为六位小数
}

1.2 小数位的:ceil-进一法、Floor-去尾法、Trunc-取整数部分

func Ceil(x float64 ) float64

func Floor(x float64 ) float64

func Trunc(x float64 ) float64

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Ceil(1.4))
	fmt.Println(math.Ceil(1.8))
	fmt.Println(math.Floor(1.4))
	fmt.Println(math.Floor(1.8))
	fmt.Println(math.Trunc(1.4))
	fmt.Println(math.Trunc(1.8))
}

1.3 Mod-取余、取整、Remainder-距离整除差值、Modf-分别取整数和小数部分

先看下除法运算,结果的值的精度依赖于被除数。当被除数为整数,则结果自动取整;当被除数为 float32,结果默认为带七位小数的浮点数;若为 float64 则结果保留16 位小数。如下示例:

复制代码
package main

import (
	"fmt"
)

func main() {
	result_int := 8 / 3
	result_float := float32(8) / 3
	fmt.Printf("int  : %v\n", result_int)
	fmt.Printf("float: %v\n", result_float)

	float_a := 7.7 // 默认为:float64
	float_b := 3.3
	fmt.Println("a/b-32         :", float32(float_a)/float32(float_b)) // float32 默认保留 7 位
	fmt.Println("a/b-64         :", float_a/float_b) // float64 默认保留 16 位
	num2 := fmt.Sprintf("%.5f", float_a/float_b) // 手动指定保留 5 位
	fmt.Println("指定保留5位小数:", num2)
}

取整和取余

复制代码
package main

import (
	"fmt"
)

func main() {
	// 取整
	result_int := 8 / 3
	fmt.Printf("%v\n", result_int) // 输出:2
	// 取余
	int_a := 7
	int_b := 4
	fmt.Println(int_a % int_b) // 输出:3 // 百分号 % 用来取余数,只能用于整数之间
}

采用 func Mod(x, y float64 ) float64取余:

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Mod(7, 4))
	fmt.Println(math.Mod(7.2, 4))
	fmt.Println(math.Mod(7, 4.1))
	fmt.Println(math.Mod(7.2, 4.1))
}

通过 func Remainder(x, y float64) float64计算整除剩余值:

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Remainder(7, 4))
	fmt.Println(math.Remainder(7.2, 4))
	fmt.Println(math.Remainder(7, 4.1))
	fmt.Println(math.Remainder(7.2, 4.1))
}

通过func Modf(f float64) (int float64, frac float64)取整数和小数部分:

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	intv, frac := math.Modf(3.14)
	fmt.Println(intv)
	fmt.Printf("%f", frac)
}

1.4 Max-最大值、Min-最小值

func Max(x, y float64 ) float64

func Min(x, y float64 ) float64

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Max(1.5, 4.5))
	fmt.Println(math.Max(-1.5, -4.5))
	fmt.Println(math.Min(1.5, 4.5))
	fmt.Println(math.Min(-1.5, -4.5))
}

1.5 Dim-差的绝对值(标准差)

func Dim(x, y float64 ) float64

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Dim(-1.4, -4))
	fmt.Println(math.Dim(-0.4, -40))
}

1.6 Abs-绝对值、Sqrt-平方根、Cbrt-立方根、Pow-数值的 n 次方、Pow10-10 的 n 次方

func Abs(x float64 ) float64

func Sqrt(x float64) float64

func Cbrt(x float64) float64

func Pow(x, y float64 ) float64

func Pow10(n int) float64

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Abs(-1.4))
	fmt.Println(math.Sqrt(9))
	fmt.Println(math.Cbrt(8))
	fmt.Println(math.Pow(2, 2))
	fmt.Println(math.Pow(2, 3))
	fmt.Println(math.Pow10(2)) // 输出:100
}

1.7 NaN-取一个非数字的值、IsNaN-判断值是否为非数字

func NaN() float64

func IsNaN(f float64) (is bool)

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.IsNaN(-1.4))
	nan := math.NaN()
	fmt.Println(math.IsNaN(nan))
}

1.8 Signbit-判断值是负数,0 或正数返回 false

func Signbit(x float64) bool

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Signbit(-1))
	fmt.Println(math.Signbit(0))
	fmt.Println(math.Signbit(1))
}

二、math 中的数学常量

如下常用的数学常量示例:

复制代码
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi)
	fmt.Println(math.E)
	fmt.Println(math.Inf(-1))
	fmt.Println(math.Inf(0))
	fmt.Println(math.NaN())
}

其他常用数学常量还有:

  • MaxInt8、MaxInt16、MaxInt32、MaxInt64:表示各种整数类型的最大值。
  • MinInt8、MinInt16、MinInt32、MinInt64:表示各种整数类型的最小值。
  • MaxFloat32、MaxFloat64:表示各种浮点数类型的最大值。
  • MinFloat32、MinFloat64:表示各种浮点数类型的最小值。

参考:https://golang.google.cn/pkg/math/

相关推荐
研究司马懿11 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo