for循环 – 带浮点数的GoLang for循环创建错误
有人可以解释以下内容.我有一个函数在go中接受一些float64,然后使用这个值来计算很多其他值.功能看起来像
func (g *Geometry) CalcStresses(x,zmax,zmin float64)(Vertical) 将结果放入类似的结构中 type Vertical struct { X float64 Stresses []Stress } 现在有趣的是这个.如果我这样调用这个函数; for i:=14.0; i<15.0; i+=0.1{ result := geo.CalcStresses(i,10,-10) } 那么我得到很多结果,其中Stress数组是空的,另外有趣的细节是x有时显示像一个有??很多小数的数字(如14.3999999999999999998) 但是,如果我这样调用这个函数; for i:=0; i<10; i++{ x := 14.0 + float64(i) * 0.1 result := geo.CalcStresses(x,-10) } 一切都很好. 有谁知道为什么会这样? 提前致谢, 解决方法
并非所有实数都可以用二进制浮点格式精确表示,因此循环浮点数会产生麻烦.
来自维基百科Floating point
This code for i := 14.0; i < 15.0; i += 0.1 { fmt.Println(i) } 产生这个 14 14.1 14.2 14.299999999999999 14.399999999999999 14.499999999999998 14.599999999999998 14.699999999999998 14.799999999999997 14.899999999999997 14.999999999999996 您可以使用math.big.Rat类型准确表示有理数. Example x := big.NewRat(14,1) y := big.NewRat(15,1) z := big.NewRat(1,10) for i := x; i.Cmp(y) < 0; i = i.Add(i,z) { v,_ := i.Float64() fmt.Println(v) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |