为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2023-06-01 16:11:12
当我审查一个 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)


查看完整回答
反对 回复 2023-06-01
?
江户川乱折腾

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


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信