Julia 朱莉娅:浮点数错了吗?

Julia 朱莉娅:浮点数错了吗?,julia,Julia,如何确保在每次迭代中添加0.2,得到正确的结果 some = 0.0 for i in 1:10 some += 0.2 println(some) end 上面的代码给了我 0.2 0.4 0.6000000000000001 0.8 1.0 1.2 1.4 1.5999999999999999 1.7999999999999998 1.9999999999999998 浮点数仅大致正确,如果加起来等于无穷大,误差将变为无穷大,但仍然可以非常精确地进行计算。如果需要评估结果

如何确保在每次迭代中添加
0.2
,得到正确的结果

some = 0.0
for i in 1:10
    some += 0.2
    println(some)
end
上面的代码给了我

0.2
0.4
0.6000000000000001
0.8
1.0
1.2
1.4
1.5999999999999999
1.7999999999999998
1.9999999999999998

浮点数仅大致正确,如果加起来等于无穷大,误差将变为无穷大,但仍然可以非常精确地进行计算。如果需要评估结果并查看其是否正确,可以使用
isapprox(a,b)
a≈ b

否则,可以在for循环中添加整数,然后除以10

some = 0.
for i in 1:10
    some += 2.
    println(some/10.)
end
#0.2
#0.4
#0.6
#0.8
#1.0
#1.2
#1.4
#1.6
#1.8
#2.0
有关使用浮动计数的更多信息:

您可以在一个范围内进行迭代,因为它们使用一些巧妙的技巧来返回更多“自然”值:


你不能:这是浮点运算的一个基本限制,广泛应用于计算机编程中,包括Julia:。如果您想坚持标准的
Float64
,您可以使用任意精度的数字(在Julia中)或其他类型的算术(例如,Julia中也有相应的程序包)put,这是无法避免的,您必须接受这一限制。您可以使用补偿来减少错误,请参见选项三:使用分数
some=0//1
some+=1//5
some = 0.
for i in 1:10
    some += 2.
    println(some/10.)
end
#0.2
#0.4
#0.6
#0.8
#1.0
#1.2
#1.4
#1.6
#1.8
#2.0
julia> collect(0:0.2:2)
11-element Vector{Float64}:
 0.0
 0.2
 0.4
 0.6
 0.8
 1.0
 1.2
 1.4
 1.6
 1.8
 2.0

julia> collect(range(0.0, step=0.2, length=11))
11-element Vector{Float64}:
 0.0
 0.2
 0.4
 0.6
 0.8
 1.0
 1.2
 1.4
 1.6
 1.8
 2.0