Skip to content

有些场景的数值计算不能容忍 float64 的精度丢失,这时可以用 math/big 包做高精度运算。

选择高精度数值类型 ​

Go 标准库中的 math/big 包提供了高精度的整数、浮点数和有理数类型,可以处理任意精度的数值运算。

  • big.Int:用于高精度的整数运算。
  • big.Float:用于高精度的浮点数运算。
  • big.Rat:用于高精度的有理数运算。

示例:使用 big.Float ​

go
package main

import (
	"fmt"
	"math/big"
)

func main() {
	// 创建两个高精度浮点数
	a := new(big.Float).SetFloat64(1.0 / 3.0)
	b := new(big.Float).SetFloat64(1.0 / 3.0)

	// 执行加法运算
	c := new(big.Float).Add(a, b)

	// 输出结果
	fmt.Printf("a: %.50f\n", a)
	fmt.Printf("b: %.50f\n", b)
	fmt.Printf("c: %.50f\n", c)
}

在这个示例中,big.Float 用于高精度的浮点数计算,避免了浮点数运算中的精度丢失问题。

高精度类型的使用场景 ​

  • 金融计算:在金融应用中,金额计算要求非常高的精度,不能接受浮点数运算带来的误差。
  • 科学计算:在科学和工程计算中,某些应用需要高精度的数值结果。
  • 加密算法:加密和解密操作有时需要高精度的整数运算。

注意事项 ​

  • 性能:高精度数值类型通常比原生浮点数类型性能要低,因为它们需要更多的内存和计算资源。
  • 复杂性:使用高精度数值类型可能会增加代码的复杂性,需要更多的代码来处理这些类型的初始化和运算。

总结 ​

math/big 换来的是精度,代价是比原生类型慢、写起来也更啰嗦(见上文注意事项)。精度不容出错的场景(金融、科学计算)用它;日常显示和统计,float64 就够。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang