float have size of 4 bytes and long have size of 8 bytes.
So, size of float is smaller than size of long. but, range of float is greater than long.
Same case for decimal and double.
Data Types
+----------+------------+----------------------+
| Data Type| Size | Range |
+----------+------------+----------------------+
| long | 8 bytes |-9.22e18 .. 9.22e18 |
| float | 4 bytes |-3.40e38 .. 3.40e38 |
| decimal | 16 bytes |-7.92e28 .. 7.92e28 |
| double | 8 bytes |-1.80e308 .. 1.80e308 |
+----------+------------+----------------------+
Example:
decimal f = 10000000000000000000.0m; //takes 16 bytes
double d = 10000000000000000000000000000.0d; //takes 8 bytes
So, double can hold greater value and takes less size than decimal.Why?
Because double has devoted more bits to the exponent than the decimal has.