For loop 带浮点数的GoLang for循环创建错误

For loop 带浮点数的GoLang for循环创建错误,for-loop,floating-point,go,rounding,For Loop,Floating Point,Go,Rounding,有人能解释一下吗。我在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{ re

有人能解释一下吗。我在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)
}
for i:=0; i<10; i++{
    x := 14.0 + float64(i) * 0.1
    result := geo.CalcStresses(x,10,-10)
}

i:=14.0;并非所有实数都可以用二进制浮点格式精确表示,因此在浮点数上循环会带来麻烦

从维基百科开始

浮点数不能精确地表示所有实数,浮点数运算不能精确地表示真正的算术运算,这一事实导致了许多令人惊讶的情况。这与计算机通常表示数字的有限精度有关

例如,0.1和0.01(二进制)的不可表示性意味着尝试平方0.1的结果既不是0.01,也不是最接近它的可表示数字

您可以使用type来准确地表示有理数

x:=big.NewRat(14,1)
y:=big.NewRat(15,1)
z:=大。纽拉特(1,10)
对于i:=x;i、 Cmp(y)<0;i=i.Add(i,z){
v、 _u:=i.Float64()
fmt.Println(五)
}

您可能会发现这些资源非常有用:哇,谢谢沃尔克,这绝对是我能得到的最全面的答案:-)很棒的论文,谢谢!
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
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)
}