Float Double Decimal 区别

2019-05-15  本文已影响0人  __XY__

本文介绍 浮点数和定点数的区别,以及float和double的区别
另外介绍了decimal以及使用场景


乌兰布统

我们知道,整数在计算机内部的表示方法都是2^n + 2^n-1+...+ 2^2 + 2^1 + 2^0.来加起来的
那么小数该如何表示呢?

在计算机内部,小数有两种表示方法: 定点数和浮点数

定点数

定点数,顾名思义,可以理解为小数点的位置是固定


image.png

图中,一共用32位长度来表示一个定点数,其中:

  可见总长度一定的情况下,如果整数位的长度越大,能代表的数值范围就越大,但是精度就会越小.
如果小数位的长度越大,代表的数值范围越小,但是精度会变大.
显然, 范围和精度,在计算机内部,是一对天然矛盾体.

浮点数

浮点数的表示方法,跟科学记数法有点类似.
图中是一个float类型的数字表示


image.png

表示方法为 (-1)^s * f * b^e
具体的说,这个实数由一个数 乘以 2 的整数次幂得到

图中

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位。

image.png
float能代表的十进制 的最大精度小数点后7位
double 能代表的 十进制 的最大进度是小数点后15位

decimal

那么可以参考这篇文章
float和double还是二进制的value来表示十进制的数字
但是,decimal本身就是十进制的value,(注意,decimal仍然是个浮点类型)

什么情况下用decimal

人类发明的任何概念,比如金融数据和比赛分数,适用于decimal
而其他的一些自然数据,当我们对精度要求不高的时候,可以使用float/double

上一篇 下一篇

猜你喜欢

热点阅读