1.浮点数陷阱:
var f1 float64 = 0.3
var f2 float64 = 0.6
fmt.Println(f1 + f2) //0.8999999999999999
结果不是我们想的0.9,这和浮点数在内存中的存储有关,计算机通过二进制的形式存储数据,大多数小数表示成二进制后是近似且无限的。
2.浮点数在内存中的表示:
最开头为符号位,1代表负数,0表示正数。
以十进制数0.085为例,0.085 * 2 ** 4 = 1.36,故其可以写成1.36 * 2^-4, 其指数位就为-4 + 127 = 123,小数位为0.36, 小数位的多少直接觉得精度的大小
3.判断浮点数为整数(最佳实践):
判断浮点数是整数的关键是指数能将小数点移到末尾。如在十进制中:1.23*10^2是整数而1.234*10^2不是。以2为底数的浮点数的判断思路类似。代码如下:
var number float32 = 0.085
func IsInt(number float32, bias int) {
bits := math.Float32bits(number)
exponent := int(bits >> 23) - bias - 23
coefficient := (bits & ((1 << 23) - 1)) | (1 << 23)
intTest := (coefficient & (1 << uint32(-exponent) - 1))
if exponent < -23 {
fmt.Println("not integer")
return
}
if exponent < 0 && intTest != 0 {
fmt.Println("not integer")
return
}
fmt.Println("integer")
}