Float Double Decimal 区别
本文介绍 浮点数和定点数的区别,以及float和double的区别
另外介绍了decimal以及使用场景
乌兰布统
我们知道,整数在计算机内部的表示方法都是2^n + 2^n-1+...+ 2^2 + 2^1 + 2^0.来加起来的
那么小数该如何表示呢?
在计算机内部,小数有两种表示方法: 定点数和浮点数
定点数
定点数,顾名思义,可以理解为小数点的位置是固定
image.png
图中,一共用32位长度来表示一个定点数,其中:
- s代表符号位,取值为0/1
- 中间的部分代表整数位部分,共7位,能代表的最大整数为255,图中计算结果为124
- 最右边的部分为小数位部分. 计算方式为2-1+2-2+2^-3...... = 0.25
以上代表数字 124 + 0.25 = 124.25
可见总长度一定的情况下,如果整数位的长度越大,能代表的数值范围就越大,但是精度就会越小.
如果小数位的长度越大,代表的数值范围越小,但是精度会变大.
显然, 范围和精度,在计算机内部,是一对天然矛盾体.
浮点数
浮点数的表示方法,跟科学记数法有点类似.
图中是一个float类型的数字表示
image.png
表示方法为 (-1)^s * f * b^e
具体的说,这个实数由一个数 乘以 2 的整数次幂得到
图中
- s 还是代表符号位
- e 图中代表124,真正计算的时候要减去127,得到的结果可正可负
- f 图中代表0.25, 真正计算的时候要加上1 ,这个长度约大,代表的精度约高.
float vs double
范围上的区别
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:
1bit(符号位) 11bits(指数位) 52bits(尾数位)
精度上的区别
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
float能代表的十进制 的最大精度小数点后7位
double 能代表的 十进制 的最大进度是小数点后15位
decimal
那么可以参考这篇文章
float和double还是二进制的value来表示十进制的数字
但是,decimal本身就是十进制的value,(注意,decimal仍然是个浮点类型)
- decimal能拥有更高的精度:28位
- 但是decimal的性能要比float/double慢很多.性能为后者的1/20.
什么情况下用decimal
人类发明的任何概念,比如金融数据和比赛分数,适用于decimal
而其他的一些自然数据,当我们对精度要求不高的时候,可以使用float/double