- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当我审查一个 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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我正在对新标签进行一些试验,并且已经遇到了第一个障碍。我想我应该通过实现经典棋盘游戏 Go/Baduk/Weiqi 的一个版本来开始尝试。 我使用 moveTo() 和 lineTo() 绘制了 xy
我注意到标准 Go 库 (Y0) 中定义了用于一阶、二阶和 N 阶贝塞尔函数(Y0、Y1、Yn)的函数。我似乎无法确定这些数学函数的实际应用会使它们变得如此重要以至于包含在标准库中。 有人能帮帮我吗?
我对 kubernetes 的 golang API 有一些疑问。 我应该使用哪一个? k8s.io/client-go 还是 k8s.io/kubernetes/pkg/client?有什么区别?
我正在处理需要 big.Float 类型的数字,我需要将它们分开。我知道 big.Int 有一个 .Div() 函数,但如果我是正确的,那会截断值并失去我使用 big.Float. 相关代码 func
http://golang.org/pkg/sort/ 这是来自 Go 的例子。 // OrderedBy returns a Sorter that sorts using the less fu
我正在尝试使用两种或多种编程语言实现一个带有 float 的程序。该程序确实说了 50k 次迭代,最终将误差降低到非常小的值。 为确保我的结果具有可比性,我想确保在不同语言中使用相同精度的数据类型。请
http://play.golang.org/p/xjs-jwMsr7 我有这个功能 func (e *MyError) Error() string { return fmt.Sprint
code : type ByteSlice []byte func (p *ByteSlice) Append(data []byte) { slice := *p slice = appen
我一直在 Node 和 Go 中尝试使用 WebSockets 和 HTTP/2 库。我的基本设置是创建客户端和服务器,从服务器重复发送文件并测量时间,直到每个文件在客户端可用。 令我惊讶的是,HTT
我是一名优秀的程序员,十分优秀!