```java
double a = 3.2222222222222221;
double b = 3.2222222222222222;
```
> `a==b` true;
> `a<b` false;
> `print(a)` 为 `3.2222222222222223`;
> `print(b)` 为 `3.2222222222222223`;
因为 `a` 和 `b` ,在编译为`class`文件的时候就已经做了转化;
末尾的1,2,3,4,5会都变成3,6,7,8,9都会变成8。
## 通常
- `float` 可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度。
- `double` 可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度。
其实不论是 `float` 还是 `double` 在存储方式上都是遵从 `IEEE` 的规范的,`float`遵从的是`IEEE R32.24`,而 `double` 遵从的是 `R64.53`。
> 无论是单精度还是双精度在存储中都分为三个部分:
1. 符号位(`Sign`): 0代表正,1代表为负;
2. 指数位(`Exponent`):用于存储科学计数法中的指数数据,并且要加上偏移量(`float偏移127,double偏移量1023` ,避免出现负值);
3. 尾数部分(Mantissa):尾数部分;
![float](https://img-blog.csdnimg.cn/20190626212200425.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aWV4dWVqaWFuLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70)
![double](https://img-blog.csdnimg.cn/20190626212200447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aWV4dWVqaWFuLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70)
## 疑问
单精度和双精度计算还是有些不一样
```java
0.2f = 0.2
0.2d = 0.20000000298023224
```
*****
文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦~!~!
想阅读作者的更多文章,可以查看我 [个人博客](http://dandanlove.com/) 和公共号:![振兴书城](https://imgconvert.csdnimg.cn/aHR0cDovL3VwbG9hZC1pbWFnZXMuamlhbnNodS5pby91cGxvYWRfaW1hZ2VzLzEzMTk4NzktNjEyYzRjNjZkNDBjZTg1NS5qcGc?x-oss-process=image/format,png)