astype() changes values unexpectedly 
#### Code Sample, a copy-pastable example if possible

```python
In[89]: df = pd.DataFrame({'a':[11111,22222,3333]})
In[90]: df
Out[90]: 
       a
0  11111
1  22222
2   3333
In[91]: df.astype('float16')
Out[91]: 
         a
0  11112.0
1  22224.0
2   3332.0
In[92]: df.astype('float32')
Out[92]: 
         a
0  11111.0
1  22222.0
2   3333.0
In[93]: df['a'].astype('float16').astype('int16')
Out[93]: 
0    11112
1    22224
2     3332
Name: a, dtype: int16

In[106]: df['a'].astype('float16').describe()
Out[106]: 
count    3.000000e+00
mean     1.222400e+04
std               inf
min      3.332000e+03
25%      7.222000e+03
50%      1.111200e+04
75%      1.666800e+04
max      2.222400e+04
```
#### Problem description

I'm trying to improve performance by changing the dtypes to more efficient ones in my code. I came across this use case which seems very odd to me. I expected `astype('float16')` to fail or turn to `inf` if it didnt manage to change the type, not alter the data. 

I also saw, that in the .descibe() method, if a dtype is 'float16' some fields come back as `inf` when I expected it to round it up and not just have `inf` - if the column is `float32` then describe will work, but I dont want to double up on memory just for the describe method to function. 


#### Expected Output
In the conversion to dtypes - fail if its impossible to convert or put `inf` in the place of the data that cant be converted. 
In the descrbe() function - have the option to round the numbers so you will not get `inf`

#### Bigger picture
this thing came out of me trying to make some optimisation to our memory usage doing something like this:

```
    @staticmethod
    def optimize_float(series):
        low_consumption = series.astype('float16')
        if any(low_consumption.isin([np.inf])):
            medium_consumption = series.astype('float32')
            if any(medium_consumption.isin([np.inf])):
                return series.astype('float64')
            return medium_consumption
        return low_consumption
```

If this is a bad idea, then its my bad - but changing the data still seems weird to me

#### Output of ``pd.show_versions()``
<details>
In[110]: pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.6.5.final.0
python-bits: 64
OS: Darwin
OS-release: 18.6.0
machine: x86_64
processor: i386
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None

pandas: 0.23.4
pytest: 3.5.0
pip: 19.1.1
setuptools: 41.0.1
Cython: 0.26.1
numpy: 1.15.4
scipy: 0.19.1
pyarrow: None
xarray: None
IPython: 7.5.0
sphinx: None
patsy: None
dateutil: 2.6.1
pytz: 2017.2
blosc: None
bottleneck: None
tables: 3.4.2
numexpr: 2.6.9
feather: None
matplotlib: 3.1.0
openpyxl: 2.5.3
xlrd: 1.1.0
xlwt: 1.3.0
xlsxwriter: None
lxml: 4.1.1
bs4: 4.4.1
html5lib: 0.9999999
sqlalchemy: 1.2.12
pymysql: 0.9.2
psycopg2: 2.7.3.2 (dt dec pq3 ext lo64)
jinja2: 2.9.6
s3fs: None
fastparquet: 0.2.1
pandas_gbq: 0.6.1
pandas_datareader: None
</details>
