BUG: Handle floating point boundaries in `qcut`
- [x] closes #59355 
- [x] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [x] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [x] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
- [x] Added an entry in the latest `doc/source/whatsnew/v3.0.0.rst` file if fixing a bug or adding a new feature.

Panda's `quantile` uses NumPy's `percentile`, so it has to convert the quantile (between 0 and 1) to a percentile (between 0 and 100). However, `np.percentile` itself uses NumPy's quantile code, so `np.percentile` [converts from a percentile back into a quantile](https://github.com/numpy/numpy/blob/1d49c7f7ff527c696fc26ab2278ad51632a66660/numpy/lib/_function_base_impl.py#L4271). Together, these two operations can introduce a slight floating point error when the quantile inputs are multiplied then divided by 100, which is not a power of 2. This PR changes Panda's quantile code to directly use NumPy's quantile code, which was [not available](https://github.com/numpy/numpy/pull/10199) when the original [Pandas quantile code was written](https://github.com/pandas-dev/pandas/pull/14536).

This PR also changes how `qcut` picks quantiles when asked to split into a fixed number of quantiles. Some quantiles, such as 5/7, can't be represented as floats and have to be rounded to the nearest representable number. If that involves rounding down, then the level that defines the upper bound of the 5/7 quantile is incorrectly assigned to the 6/7 quantile. This PR changes the quantiles to round up rather than to the nearest when picking a floating point representation.



Thanks @rob-sil 