Generating equidistantly spaced grids is simply not always possible.
The reason is that the absolute spacing of the possible floating point numbers depends on their magnitude [1].
If you - for some reason - want the same grid spacing everywhere you may choose an appropriate new spacing.
Curiously, either by design or accident, arange() seems to do something similar as was mentioned by Eric. It creates a new grid spacing by adding and subtracting the starting point of the grid. This often has similar effect as adding and subtracting N*dx (e.g. if the grid is symmetric around 0.0). Consequently, arange() seems to trade keeping the grid spacing constant for a larger error in the grid size and consequently in the end point.
1. Comparison to calculations with decimal can be difficult as not all simple decimal step sizes are exactly representable as
finite floating point numbers.