It’s completely correct (given it’s assumptions) for Float64/IEEE.
You can do accurately with rationals (in Julia, and in Raku, formerly Perl 6, rationals are the default number type), with:
julia> 1//10 + 2//10 # Rational math is slower
julia> Float64(1//10 + 2//10) # You can print out in a user-friendly fashion in the end, not sure it always applies, since bitstring(Float64(1//10 + 2//10))
All decimal numbers are also accurate with (this is slower than Float64, since it doesn’t have hardware support, though some systems have that, and then I think not with this package, though likely faster than with rationals):
Note, with it 0.3 is accurate, but e.g. 1/3 isn’t, then rationals are better).
julia> big"0.1" + big"0.2" # BigFloat has same problem, but is closer to the truth than Float64 (slower than it or rationals):
That’s not tricky because of floating point numbers, there are simply different decisions taken because rounding isn’t unequivocally defined. That has nothing to do with floating point arithmetic, half integers are exactly represented by floating point numbers.