2.2.1 什么是浮点类型?
浮点类型就是用来表示带小数的数字,比如 3.14、0.001、-9.8 等。
仓颉提供了三种浮点类型:
| 类型 | 位数 | 有效数字位(约) | 对应 IEEE 754 |
|---|---|---|---|
Float16 |
16 | 3 位 | 半精度(binary16) |
Float32 |
32 | 6 位 | 单精度(binary32) |
Float64 |
64 | 15 位 | 双精度(binary64) |
❗IMPORTANT
在多种浮点类型都适合的情况下,首选 Float64。因为精度低的浮点类型在多次计算后误差会快速累积,而且能精确表示的整数范围也很有限。
2.2.2 浮点字面量
十进制写法
最常见的写法,就是日常生活中的小数:
Cangjie
let a: Float32 = 3.14 // 普通小数 3.140000
let b: Float32 = 2e3 // 科学计数法:2 × 10³ = 2000.000000
let c: Float32 = 2.4e-1 // 2.4 × 10⁻¹ = 0.240000
let d: Float64 = .123e2 // 0.123 × 10² = 12.300000
ℹ️NOTE
e 或 E 表示以 10 为底的指数,如 2e3 = 2 × 10³ = 2000,2e-1 = 2 × 10⁻¹ = 0.2
十六进制写法
以 0x 或 0X 开头,必须包含以 p 或 P 为前缀的指数部分(底数为 2):
Cangjie
let e: Float64 = 0x1.1p0 // 1.0625 × 2⁰ = 1.0625
let f: Float64 = 0x1p2 // 1.0 × 2² = 4.0
let g: Float64 = 0x.2p4 // 0.125 × 2⁴ = 2.0
💡TIP
十六进制浮点数不常用,了解即可。p 表示以 2 为底的指数,如 0x1p2 = 1.0 × 2² = 4.0
2.2.3 类型后缀
和整型类似,浮点数也可以通过后缀明确类型:
| 后缀 | 类型 |
|---|---|
f16 |
Float16 |
f32 |
Float32 |
f64 |
Float64 |
使用示例:
Cangjie
let a = 3.14f32 // Float32 类型
let b = 2e3f32 // Float32 类型,值为 2000.0
let c = 2.4e-1f64 // Float64 类型,值为 0.24
let d = .123e2f64 // Float64 类型,值为 12.3
2.2.4 小结
| 概念 | 要点 |
|---|---|
| 浮点类型 | Float16(3位精度)、Float32(6位精度)、Float64(15位精度) |
| 首选类型 | Float64,精度高、误差小 |
| 十进制字面量 | 3.14、2e3(科学计数法,e 底数为 10) |
| 十六进制字面量 | 0x1.1p0(p 底数为 2,必须带指数) |
| 类型后缀 | f16、f32、f64 |
2.2.5 常见问题
Q1:浮点数计算为什么不精确?
这不是仓颉的问题,而是所有编程语言都面临的问题。因为计算机用二进制存储小数,而很多十进制小数(比如 0.1)无法用二进制精确表示——就像用十进制无法精确表示 1/3(结果是 0.3333...)一样。
💡TIP
日常开发中这点误差通常可以忽略。如果需要精确计算(比如金额),可以用专门的处理方式。
Q2:`Float64` 和 `Float32` 选哪个?
无脑选 Float64。原因:
Float64有约 15 位有效数字,Float32只有约 6 位Float32在多次计算后误差会快速累积- 大多数场景下,多占用的那点内存不值一提
Q3:科学计数法的 `e` 是什么意思?
e 表示"乘以 10 的几次方":
| 写法 | 含义 | 结果 |
|---|---|---|
2e3 |
2 × 10³ | 2000 |
2e-1 |
2 × 10⁻¹ | 0.2 |
1.5e2 |
1.5 × 10² | 150 |
相当于把小数点往右(正指数)或往左(负指数)移动。
Q4:十六进制浮点数什么时候用?
基本用不到。十六进制浮点数是留给需要精确控制二进制表示的底层场景用的(比如硬件驱动、科学计算库)。普通开发者只需要知道有这回事,用到时再回来查就行。
