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

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


//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

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


胡子哥哥
浏览 98回答 2
2回答

青春有我

实际上,int64((now&nbsp;-&nbsp;1)/blockInterval&nbsp;*&nbsp;blockInterval不会一直返回相同的结果。您会注意到它每 10 秒更改一次。这是由 Go 中的整数除法引起的。如果对任意两个数字应用整数除法,则结果的小数部分(余数)将被丢弃。例如,int(12 / 10) = 1。在您的特定情况下 - 除以 10,代码会将余数从 1 减到 9,并且只会在您到达下一个 10 时增加该值。如果你想提高运算的精度,那么你可以像这样强制进行浮点除法float64(12)/float64(10)。

江户川乱折腾

你的问题在这里:result := int64((now-1)/blockInterval) * blockIntervaltime.Now().Unix()以秒为单位返回当前 Unix 时间。因此,对于连续迭代,time.Now().Unix()将是:125789400112578940021257894003但是在你的函数中,你减去 1,然后除以 10,所以上面的每一个都变成下面的,因为小数部分被去掉了。125789400125789400125789400然后当你乘以blockInterval(10)时,它们都变成:125789400012578940001257894000所以,result结果是一样的。如果让它运行超过 10 秒,您会result在 10 秒后看到变化:https://play.golang.org/p/LgPtHwjwlC1
打开App,查看更多内容
随时随地看视频慕课网APP