将 float 转换为 int 时的 Golang 怪异行为
Golang weird behavior when converting float to int
我在golang中有如下代码:
var fnum float32 = 99999999;
var inum int32 = int32(fnum);
fmt.Println(inum); // This prints out 100000000
为什么99999999变成了100000000?
我不认为我超过了 float32 和 int32 的限制,所以不确定为什么会这样。
A (IEEE 754) 32-bit float 表示形式为
的实数值
value = (−1)^sign × 2^e × (1 + 2^−1 b[22] + 2^−2 b[21] + ... + 2^−23 b[0])
其中“e”是 −126 到 +127 之间的整数指数,“b[22], ..., b[0]” 构成有效数位。
显然,这种表示是有限的,并不是所有的实数都能准确表示。对于整数,不能精确表示为 float32 的最小整数是 2^24 + 1 = 16777217。特别是此时指数因子为 2^24,但最小有效数项为 2^−23 b[ 0], 2^24以上的奇数(值%2)≠0不能准确表示。
同样对于值 99999999,指数因子是 2^26,并且 2^26 以上且 (value % 8) ≠ 0 的整数不能完全表示。最接近 99999999 的可表示 float32 值是 99999992 和 100000000。
我在golang中有如下代码:
var fnum float32 = 99999999;
var inum int32 = int32(fnum);
fmt.Println(inum); // This prints out 100000000
为什么99999999变成了100000000? 我不认为我超过了 float32 和 int32 的限制,所以不确定为什么会这样。
A (IEEE 754) 32-bit float 表示形式为
的实数值value = (−1)^sign × 2^e × (1 + 2^−1 b[22] + 2^−2 b[21] + ... + 2^−23 b[0])
其中“e”是 −126 到 +127 之间的整数指数,“b[22], ..., b[0]” 构成有效数位。
显然,这种表示是有限的,并不是所有的实数都能准确表示。对于整数,不能精确表示为 float32 的最小整数是 2^24 + 1 = 16777217。特别是此时指数因子为 2^24,但最小有效数项为 2^−23 b[ 0], 2^24以上的奇数(值%2)≠0不能准确表示。
同样对于值 99999999,指数因子是 2^26,并且 2^26 以上且 (value % 8) ≠ 0 的整数不能完全表示。最接近 99999999 的可表示 float32 值是 99999992 和 100000000。