当我审查一个 Golang 项目时,我发现了一些这样的代码, now是 Unix timestap。每秒调用一次此函数://main.gofunc PrevSlot(now int64) int64 { // now = time.Now().Unix() var blockInterval = int64(10) result := int64((now-1)/blockInterval) * blockInterval // why result is same ? plog.Println("PrevSlot:", int64(result), int64((now-1)/blockInterval), now) return result}func main() { ticker := time.NewTicker(1 * time.Second) for { <-ticker.C now := time.Now().Unix() PrevSlot(now) }}输出:2019-01-16 10:58:31.668597 I | dpos.go: PrevSlot: 1547607510 154760751 15476075112019-01-16 10:58:32.668649 I | dpos.go: PrevSlot: 1547607510 154760751 15476075122019-01-16 10:58:33.668568 I | dpos.go: PrevSlot: 1547607510 154760751 15476075132019-01-16 10:58:34.668572 I | dpos.go: PrevSlot: 1547607510 154760751 15476075142019-01-16 10:58:35.668547 I | dpos.go: PrevSlot: 1547607510 154760751 1547607515结果是一样的。这是为什么,原理是什么?
2 回答
青春有我
TA贡献1784条经验 获得超8个赞
实际上,
int64((now - 1)/blockInterval * blockInterval
不会一直返回相同的结果。您会注意到它每 10 秒更改一次。
这是由 Go 中的整数除法引起的。如果对任意两个数字应用整数除法,则结果的小数部分(余数)将被丢弃。例如,int(12 / 10) = 1
。在您的特定情况下 - 除以 10,代码会将余数从 1 减到 9,并且只会在您到达下一个 10 时增加该值。
如果你想提高运算的精度,那么你可以像这样强制进行浮点除法float64(12)/float64(10)
。
江户川乱折腾
TA贡献1851条经验 获得超5个赞
你的问题在这里:
result := int64((now-1)/blockInterval) * blockInterval
time.Now().Unix()以秒为单位返回当前 Unix 时间。因此,对于连续迭代,time.Now().Unix()将是:
1257894001
1257894002
1257894003
但是在你的函数中,你减去 1,然后除以 10,所以上面的每一个都变成下面的,因为小数部分被去掉了。
125789400
125789400
125789400
然后当你乘以blockInterval(10)时,它们都变成:
1257894000
1257894000
1257894000
所以,result结果是一样的。如果让它运行超过 10 秒,您会result在 10 秒后看到变化:
https://play.golang.org/p/LgPtHwjwlC1
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消