golang 浮点数解析

本文探讨了Golang中浮点数存在的陷阱,由于计算机以二进制形式存储导致大多数小数无法精确表示。同时,文章介绍了浮点数在内存中的表示方式,并提供了一种判断浮点数是否为整数的最佳实践方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值