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.   

    二进制表示浮点数本身就是一种近似的精确,在计算机内部采用的是科学计数法表示,详见这个blog:
    http://blog.csdn.net/abing37/article/details/5332798
    你可以打印出你上面的那些数的二进制串,然后进行计算看看,上面的结果就很正常了。解决这个精度问题一般通过 String 结合 BigDecimal来解决。public class DigitalTest {
    public static void main(String[] args) { float f = 0.15f;
    double d = f;
    System.out.println("Float-f:"+Integer.toBinaryString(Float.floatToIntBits(f)));
    System.out.println("Double-d:"+Long.toBinaryString(Double.doubleToLongBits(d)));
    System.out.println("d=" + d);// 输出结果:0.15000000596046448
    // 同一个数弄俩不同类型!!类型提升,位数有4个字节变8个字节,有小数点后的7为升到15位
    double d1 = 0.15;
    float f1 = (float) d1;
    System.out.println("Double-d1:"+Long.toBinaryString(Double.doubleToLongBits(d1)));
    System.out.println("Float-f1:"+Integer.toBinaryString(Float.floatToIntBits(f1)));
    System.out.println("d1="+d1);
    System.out.println("f1=" + f1);// 输出结果:0.15
    // 同一个数弄俩不同类型!强制转换,有8个字节强制变4个字节,丢弃后4个字节~所以值是这个~有小数点后的15为变7位,后面都是0就舍弃啦 double d2 = 1.15 + 1.15f;
    System.out.println("Double-1.15:"+Long.toBinaryString(Double.doubleToLongBits(1.15)));
    System.out.println("Double-1.15f:"+Long.toBinaryString(Double.doubleToLongBits(1.15f)));
    System.out.println("d2=" + d2);// 输出结果:2.299999976158142
    // 类型不同,小数点后面的位数相同 小数点后面是两位相同 double d3 = 3.5 + 3.5f;
    System.out.println("Double-3.5:"+Long.toBinaryString(Double.doubleToLongBits(3.5)));
    System.out.println("Double-3.5f:"+Long.toBinaryString(Double.doubleToLongBits(3.5f)));
    System.out.println("d3=" + d3);// 输出结果:7.0 类型不同,小数点后面的位数相同 小数点后面是一位 double d4 = 1.15 + 1.25f;
    System.out.println("Double-1.15:"+Long.toBinaryString(Double.doubleToLongBits(1.15)));
    System.out.println("Double-1.25f:"+Long.toBinaryString(Double.doubleToLongBits(1.25f)));
    System.out.println("d4=" + d4);// 输出结果: 类型不同,小数点的位数是不同 结果:相加2.4 float f2 = 1.25f + 1.15f;
    System.out.println("float-1.25f:"+Integer.toBinaryString(Float.floatToIntBits(1.25f)));
    System.out.println("float-1.15f:"+Integer.toBinaryString(Float.floatToIntBits(1.15f)));
    System.out.println("f2=" + f2);// 输出结果:类型相同 小数点后数字不同 结果是2.4 }
    }
      

  2.   

    二楼解释非常到位。
    如果你觉得很难理解,就记住一点:
    如果需要精确计算,用 BigDecimal来处理数值计算就好了。
    float和double一般用于科学运算(都是天文数字)