日期:2014-05-20  浏览次数:20728 次

Java中小数位位数不是固定的么?超出部分会不会四舍五入?请各位高手指点!
今日小弟无聊想看看float和double的小数位最多可以有多少,但是却遇到一下问题:

float f0 = 0.12345678901234567890123456789f;
float f1 = 1.12345678901234567890123456789f;
float f2 = 2.12345678901234567890123456789f;
float f4 = 4.12345678901234567890123456789f;

double d0 = 0.12345678901234567890123456789;
double d1 = 1.12345678901234567890123456789;
double d2 = 2.12345678901234567890123456789;
double d4 = 4.12345678901234567890123456789;

System.out.println(f0);
System.out.println(f1);
System.out.println(f2);
System.out.println(f4);

System.out.println(d0);
System.out.println(d1);
System.out.println(d2);
System.out.println(d4);

输出结果如下:

0.12345679
1.1234568
2.1234567
4.123457
0.12345678901234568
1.1234567890123457
2.1234567890123457
4.123456789012345

关于f0和d0结果可以理解,但是为什么其他的结果小数位位数不相同呢?有些也没有进行四舍五入,难道超出的部分不会四舍五入么?
求各位大侠指点。
------解决方案--------------------
先去了解下浮点数在内存中的存储方式吧
------解决方案--------------------
java中,float类型的变量只有7位的精度,而double类型的变量有15位的精度。 
如果超出范围就会造成精度丢失,原因是十进制数的二进制表示可能不够精确,因为计算机会先把这个数字转换成2进制,就是0101那种,超出的部分会被截取,导致出现这种数据。