跳到主要内容

浮点数

Go 有哪些浮点类型?​

  • 浮点数: 用有限位数近似表示实数,float64 比 float32 有更多有效精度,但两者都不能精确保存所有十进制小数;
类型描述
float3232 位浮点数
float6464 位浮点数

浮点字面量有哪些写法?​

func main() {
a := 1.5 // 小数字面量; 默认推导为 float64
b := 3.125e2 // 科学计数法; 等于 312.5
c := 0x1p-2 // 十六进制浮点; 等于 0.25
println(a, b, c)
}

浮点数的精度问题是什么?​

  • 精度误差: 十进制小数不一定能被浮点数精确表示;
  • 金额计算: 不应直接依赖 float 精确表示;
package main

import "fmt"

func main() {
a, b := 0.1, 0.2
fmt.Printf("%.17g\n", a+b) // 0.30000000000000004:运行时浮点加法
fmt.Printf("%.17g\n", 0.1+0.2) // 常量先精确求和,再转换为 float64
}
  • 示例边界: 直接写 0.1 + 0.2 是常量表达式,不能用它证明运行时两次近似后的误差;先赋给变量才能观察对应运算;