奇怪的小数加法错误

问题描述 投票:0回答:1

尝试在循环上添加值时遇到奇怪的错误。例如,我想从 0 开始以 0.1 的增量逐渐增加 y 的值,并在 y 为 10 时停止。它是一个简单的十进制值,循环应继续,直到 y 从 9.9 变为 10,然后停止。但是,循环有时会添加一个略小于 0.1 的小数值,导致循环“错过”10,因此循环不会停止,直到它明显超过 10 并且该值最终为 10.09999999999998

to test
  let y 0
  loop [
    show y
    if y >= 10 [stop]
    set y y + 0.1
  ]
end

observer: 0
observer: 0.1
observer: 0.2
observer: 0.30000000000000004
observer: 0.4
observer: 0.5
observer: 0.6
observer: 0.7
observer: 0.7999999999999999
observer: 0.8999999999999999
observer: 0.9999999999999999
observer: 1.0999999999999999
observer: 1.2
observer: 1.3
observer: 1.4000000000000001
observer: 1.5000000000000002
observer: 1.6000000000000003
observer: 1.7000000000000004
observer: 1.8000000000000005
observer: 1.9000000000000006
observer: 2.0000000000000004
observer: 2.1000000000000005
observer: 2.2000000000000006
observer: 2.3000000000000007
observer: 2.400000000000001
observer: 2.500000000000001
observer: 2.600000000000001
observer: 2.700000000000001
observer: 2.800000000000001
observer: 2.9000000000000012
observer: 3.0000000000000013
observer: 3.1000000000000014
observer: 3.2000000000000015
observer: 3.3000000000000016
observer: 3.4000000000000017
observer: 3.5000000000000018
observer: 3.600000000000002
observer: 3.700000000000002
observer: 3.800000000000002
observer: 3.900000000000002
observer: 4.000000000000002
observer: 4.100000000000001
observer: 4.200000000000001
observer: 4.300000000000001
observer: 4.4
observer: 4.5
observer: 4.6
observer: 4.699999999999999
observer: 4.799999999999999
observer: 4.899999999999999
observer: 4.999999999999998
observer: 5.099999999999998
observer: 5.1999999999999975
observer: 5.299999999999997
observer: 5.399999999999997
observer: 5.4999999999999964
observer: 5.599999999999996
observer: 5.699999999999996
observer: 5.799999999999995
observer: 5.899999999999995
observer: 5.999999999999995
observer: 6.099999999999994
observer: 6.199999999999994
observer: 6.299999999999994
observer: 6.399999999999993
observer: 6.499999999999993
observer: 6.5999999999999925
observer: 6.699999999999992
observer: 6.799999999999992
observer: 6.8999999999999915
observer: 6.999999999999991
observer: 7.099999999999991
observer: 7.19999999999999
observer: 7.29999999999999
observer: 7.39999999999999
observer: 7.499999999999989
observer: 7.599999999999989
observer: 7.699999999999989
observer: 7.799999999999988
observer: 7.899999999999988
observer: 7.999999999999988
observer: 8.099999999999987
observer: 8.199999999999987
observer: 8.299999999999986
observer: 8.399999999999986
observer: 8.499999999999986
observer: 8.599999999999985
observer: 8.699999999999985
observer: 8.799999999999985
observer: 8.899999999999984
observer: 8.999999999999984
observer: 9.099999999999984
observer: 9.199999999999983
observer: 9.299999999999983
observer: 9.399999999999983
observer: 9.499999999999982
observer: 9.599999999999982
observer: 9.699999999999982
observer: 9.799999999999981
observer: 9.89999999999998
observer: 9.99999999999998
observer: 10.09999999999998
netlogo
1个回答
0
投票

一种快速简单的修复方法是使用

precision

to test
  let y 0
  loop [
    show y
    if y >= 10 [stop]
    set y precision (y + 0.1) 1
  ]
end
© www.soinside.com 2019 - 2024. All rights reserved.