SimpleImputer silently cast fill values to integer when the input is of integer type

### Describe the bug

Fitting the SimpleImputer on an integer array silently cast the float `fill_value` values to integer. If `fill_value` is nan, nothing is imputed but a warning is raise:
`RuntimeWarning: invalid value encountered in cast
  multiarray.copyto(a, fill_value, casting='unsafe')`

### Steps/Code to Reproduce

```
from sklearn.impute import SimpleImputer
import numpy as np
a = np.array([0, 0, 0, 1]).reshape(-1, 1)
si = SimpleImputer(missing_values=0,
                    fill_value=3.2,
                    strategy="constant").set_output()

si.fit_transform(a)
```

```
from sklearn.impute import SimpleImputer
import numpy as np
a = np.array([0, 0, 0, 1]).reshape(-1, 1)
si = SimpleImputer(missing_values=0,
                    fill_value=np.nan,
                    strategy="constant").set_output()

si.fit_transform(a)
```

### Expected Results

Either raising an error (or a warning for the first case), or casting the array to float.
```
array([[3.2],
       [3.2],
       [3.2],
       [1.]])
```

```
array([[nan],
       [nan],
       [nan],
       [1.]])
```

### Actual Results

No warning and output:
```
array([[3],
       [3],
       [3],
       [1]])
```
Warning: `RuntimeWarning: invalid value encountered in cast
  multiarray.copyto(a, fill_value, casting='unsafe')` and output:
```
array([[0],
       [0],
       [0],
       [1]])
```

### Versions

```shell
System:
    python: 3.9.18 | packaged by conda-forge | (main, Aug 30 2023, 03:53:08)  [Clang 15.0.7 ]
executable: /Users/leo/mambaforge/envs/tabular-benchmark/bin/python
   machine: macOS-12.6.5-arm64-arm-64bit

Python dependencies:
      sklearn: 1.2.2
          pip: 23.3.1
   setuptools: 68.2.2
        numpy: 1.26.2
        scipy: 1.10.1
       Cython: None
       pandas: 2.1.4
   matplotlib: 3.8.0
       joblib: 1.2.0
threadpoolctl: 3.2.0

Built with OpenMP: True

threadpoolctl info:
       user_api: blas
   internal_api: openblas
    num_threads: 8
         prefix: libopenblas
       filepath: /Users/leo/mambaforge/envs/tabular-benchmark/lib/python3.9/site-packages/numpy/.dylibs/libopenblas64_.0.dylib
        version: 0.3.23.dev
threading_layer: pthreads
   architecture: armv8

       user_api: blas
   internal_api: openblas
    num_threads: 8
         prefix: libopenblas
       filepath: /Users/leo/mambaforge/envs/tabular-benchmark/lib/libopenblas.0.dylib
        version: 0.3.24
threading_layer: openmp
   architecture: VORTEX

       user_api: openmp
   internal_api: openmp
    num_threads: 8
         prefix: libomp
       filepath: /Users/leo/mambaforge/envs/tabular-benchmark/lib/libomp.dylib
        version: None

       user_api: openmp
   internal_api: openmp
    num_threads: 8
         prefix: libomp
       filepath: /Users/leo/mambaforge/envs/tabular-benchmark/lib/python3.9/site-packages/xgboost/.dylibs/libomp.dylib
        version: None
```

COMMENT:
Indeed this is bad. We probably introduced the bug here: https://github.com/scikit-learn/scikit-learn/pull/22063

I assume that we need to make a casting rule between the dtype of `X` seen at `fit` and the `fill_value` parameter.

@LeoGrin do you fill like making a fix. Basically we need a the casting rule to apply on `_fit_dtype`. I assume that the right way to go is be always go for more precision.

Labels: Bug