【发布时间】:2021-04-01 16:50:25
【问题描述】:
我在 golang 中有以下代码:
var fnum float32 = 99999999;
var inum int32 = int32(fnum);
fmt.Println(inum); // This prints out 100000000
为什么 99999999 变成了 100000000? 我认为我没有超过 float32 和 int32 的限制,所以不知道为什么会发生这种情况。
【问题讨论】:
-
float32具有 6(或 7)位有效数字的精度,这意味着任何超过该数字的内容都可能丢失。它不是 Go 特定的,实现 IEEE754 的每种语言的行为都是一样的。 -
32 位浮点数有 24 位尾数,为您提供高达
16777216的精确整数,您的99999999更大,因此会发生舍入。然而,它很奇怪,因为转换为 int 向下取整更常见...... -
@Spektre 在转换为 int 时不是“四舍五入”,而是在
var fnum float32 = 99999999;分配期间。当int32(fnum)发生时 - 精度已经丢失。 -
@zerkms 在将
99999999转换为float的尾数部分时发生“转换为int”,因为尾数是24 位整数!!!所以是的,它在编译时出现在var fnum float32 = 99999999;行中(除非你有解释环境)尾数应该保持12499999(因为这是99999999的24 位最高有效位)但是你声称你的号码是100000000这很奇怪,但可能只是在打印过程中四舍五入尝试打印全精度,例如在.之后打印 10 位小数,你应该会看到类似9999999?.?????????? -
@Spektre
float32不能代表99999999。100000000是最接近的可表示值(相隔 1)。 binaryconvert.com/… Mantissa12499999结果到9.9999992E7(7 分开)binaryconvert.com/result_float.html?hexadecimal=4CBEBC1F