Why does rounding behave so weird?

What Julia does:

julia> hcat(5.5:-1:0.5, round.(5.5:-1:0.5))
6Γ—2 Matrix{Float64}:
 5.5  6.0
 4.5  4.0
 3.5  4.0
 2.5  2.0
 1.5  2.0
 0.5  0.0

What I expect:

6Γ—2 Matrix{Float64}:
 5.5  6.0
 4.5  5.0
 3.5  4.0
 2.5  3.0
 1.5  2.0
 0.5  1.0
1 Like

See the documentation of the round function. In particular:

The RoundingMode r controls the direction of the rounding; the default is RoundNearest, which rounds to the nearest integer, with ties (fractional values of 0.5) being rounded to the nearest even integer.

2 Likes

To obtain what you expect use

julia> hcat(5.5:-1:0.5, round.(5.5:-1:0.5, RoundUp))
6Γ—2 Matrix{Float64}:
 5.5  6.0
 4.5  5.0
 3.5  4.0
 2.5  3.0
 1.5  2.0
 0.5  1.0

or

julia> hcat(5.5:-1:0.5, ceil.(5.5:-1:0.5))
6Γ—2 Matrix{Float64}:
 5.5  6.0
 4.5  5.0
 3.5  4.0
 2.5  3.0
 1.5  2.0
 0.5  1.0

Specifically this rounding mode is the default because if you always round 0.5 up (or down), round will on average slightly increase your numbers. By alternating whether 0.5 rounds up or down, you make it so that your mean isn’t changed.

2 Likes

I came to the conclusion: Rounding is wired^^
Thanks for all your inside