Strange decimal addition errors

61 Views Asked by At

I am encountering a bizarre error when trying to add a value over a loop. For example, I want to incrementally increase the value of y starting from 0 at 0.1 increments and stop when y is 10. It is a simple decimal value and the loop should continue until y goes from 9.9 to 10 then stop. But, the loop is sometimes adding a decimal value slightly less than 0.1, causing the loop to "miss" 10, so the loop does not stop until it clearly exceeds 10 and the value ends up being 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
1

There are 1 best solutions below

0
Pol On

A fast and easy way to fix it is using precision.

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