gpt4 book ai didi

go - 为什么这个围棋结果一样呢?

转载 作者:IT王子 更新时间:2023-10-29 01:51:49 24 4
gpt4 key购买 nike

当我审查一个 Golang 项目时,我发现了一些这样的代码,now 是 Unix 时间戳。每秒调用一次此函数:

//main.go
func 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 1547607511
2019-01-16 10:58:32.668649 I | dpos.go: PrevSlot: 1547607510 154760751 1547607512
2019-01-16 10:58:33.668568 I | dpos.go: PrevSlot: 1547607510 154760751 1547607513
2019-01-16 10:58:34.668572 I | dpos.go: PrevSlot: 1547607510 154760751 1547607514
2019-01-16 10:58:35.668547 I | dpos.go: PrevSlot: 1547607510 154760751 1547607515

结果是一样的。这是为什么,原理是什么?

最佳答案

其实,

int64((now - 1)/blockInterval * blockInterval

不会一直返回相同的结果。您会注意到它每 10 秒更改一次。

这是由 Go 中的整数除法引起的。如果对任意两个数字应用整数除法,则结果的小数部分(余数)将被丢弃。例如,int(12/10) = 1。在您的特定情况下 - 除以 10,代码会将余数从 1 减到 9,并且仅在您到达下一个 10 时增加该值。

如果您想提高运算的精度,则可以像这样强制进行浮点除法 float64(12)/float64(10)

关于go - 为什么这个围棋结果一样呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54209933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com