Skip to content

在 Go 语言中,浮点类型用于表示带有小数点的数值。Go 提供了两种浮点类型:float32 和 float64,分别对应单精度和双精度浮点数。这些类型用于处理需要更大范围或更高精度的小数值。

浮点类型的表示和精度 ​

  1. float32:

    • 占用 32 位(4 字节)内存空间。
    • 大约能够表示 6 位小数精度。
    • 范围约为 1.18e-38 到 3.4e38。
  2. float64:

    • 占用 64 位(8 字节)内存空间。
    • 大约能够表示 15-16 位小数精度。
    • 范围约为 2.23e-308 到 1.8e308。

Go 的浮点数按 IEEE 754 标准表示和运算,精度损失和舍入误差是这套表示的固有代价。

精度和舍入误差 ​

尽管浮点数能够表示大范围的数值,但在进行浮点数运算时会存在一些精度问题,主要包括以下几个方面:

  • 精度限制:浮点数的精度有限,特别是在进行大范围数值的运算时,可能会出现精度损失。

  • 舍入误差:由于浮点数内部表示的有限精度,某些十进制数可能无法准确表示为二进制浮点数,从而导致舍入误差。

  • 比较不确定性:由于舍入误差,相等性比较(例如 == 操作符)可能会导致意外的结果。通常建议使用浮点数的近似比较方法来避免这些问题。

示例和注意事项 ​

go
package main

import (
	"fmt"
)

func main() {
	var x float32 = 1.0 / 3.0
	var y float64 = 1.0 / 3.0

	fmt.Printf("float32: %.10f\n", x)
	fmt.Printf("float64: %.10f\n", y)
}

在上面的示例中,即使是一个简单的除法运算 1.0 / 3.0,在 float32 和 float64 中的表示也会有所不同,这体现了浮点数精度和舍入误差的影响。

总结 ​

float32 占 4 字节、约 6 位小数精度,float64 占 8 字节、约 15-16 位。判断两个浮点数是否相等不要直接用 ==,改用近似比较;1.0 / 3.0 这类除法在两种类型下小数位数不同,选哪个取决于需要的精度。

参考资料 ​

同层页面 ​

相关页面 ​

Hello Golang