浮点数
Go 有哪些浮点类型?
- 浮点数: 用有限位数近似表示实数,
float64比float32有更多有效精度,但两者都不能精确保存所有十进制小数;
| 类型 | 描述 |
|---|---|
| float32 | 32 位浮点数 |
| float64 | 64 位浮点数 |
浮点字面量有哪些写法?
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是常量表达式,不能用它证明运行时两次近似后的误差;先赋给变量才能观察对应运算;