class Text
{
public static void main(String[] args)
{

float f = 0.15f;
double d = f;
System.out.println("d="+d);//输出结果:0.15000000596046448 同一个数弄俩不同类型!!类型提升,位数有4个字节变8个字节,有小数点后的7为升到15位
double d1 = 0.15;
float  f1 = (float)d1;
System.out.println("f1="+f1);//输出结果:0.15 同一个数弄俩不同类型!强制转换,有8个字节强制变4个字节,丢弃后4个字节~所以值是这个~有小数点后的15为变7位,后面都是0就舍弃啦

double d2 = 1.15 + 1.15f;
System.out.println("d2="+d2);//输出结果:2.299999976158142   类型不同,小数点后面的位数相同 小数点后面是两位相同

double d3 = 3.5 + 3.5f;
System.out.println("d3="+d3);//输出结果:7.0   类型不同,小数点后面的位数相同 小数点后面是一位 double d4 = 1.15 + 1.25f;
System.out.println("d4="+d4);//输出结果: 类型不同,小数点的位数是不同 结果:相加2.4  

float  f2 = 1.25f +1.15f;
System.out.println("f2="+f2);//输出结果:类型相同 小数点后数字不同 结果是2.4

 


}
}
//有此结果的有一个新问题!  也就是 d2 d3 d4 的值得问题~~没搞清楚 为什么小数点位后面的数相同且小数点后面数超过两位以上,相加就有会出现精度问题呢??刚搞懂一个问题 新问题有出现啦~~大家想想为啥呀???是不是我咱牛角尖啦??问题出在那里呢??~是不是我钻牛角尖啦??问题出在那里呢??如何避免这样的问题发生?主要想知道出现这个结果的原因是什么?我刚接触JAVA 不对的地方大家请多批评指正呀~谢谢大家~

解决方案 »

  1.   

    浮点类型不精确,依赖cpu.
    建议使用decibel
      

  2.   

    类型转换有一个阶梯,学过C的应该知道,Java估计也沿用此思想,精确度低向精确度高转换是建议的,相反的则会损失精度,通常不推荐,像前面说的8位压缩到4位,就会丢弃后面的有效小数位。
      

  3.   

    Sun声明过浮点数只能达到一个很接近原数的情况,不保证完全相同;
      

  4.   

    这也就是做一些减法之类的计算很容易拿到*.999999999999....的原因了吧~~
    lz 恩 java语法规范里面有写 可以去看看