/*
char
|
byte-->short-->int-->long
|
float-->double
*/
箭头表示合法转换。
请问:浮点型转换的时候会失精度。为什么?float f1 = 123456789.0f;
double d1 = f1;
System.out.println(d1);
float f2 = 0.123456789f;
double d2 = f2;
System.out.println(d2);
结果:
1.23456792E8
0.12345679104328156

解决方案 »

  1.   


    /*
    char
    |
    byte-->short-->int-->long
    |
    float-->double
    */
      

  2.   

    上图中 int 是指向double.....
    怎么会EditPlus上显示和这里不一样 
      

  3.   


    其实不是丢失精度,而是扩展精度。float只有七八位有效数字,而double有十几位有效数字。同一个数值(编码数值)在用float表示时,精度只有七八位,而再赋值给double表示时,被扩展到十几位了。
      

  4.   

    哦~原来是这样。float f1 = 12345678f;
    double d1 = f1;
    System.out.println(d1);
    float f2 = 0.12345678f;
    double d2 = f2;
    System.out.println(d2); 1.2345678E7
    0.12345678359270096
      

  5.   


    这个要看内部表示,二进制其实无法精确表示部分十进制小数(比如0.1),所以才有了精度,
    IEEE 754规定了四种表示浮点数值的方式:其中单精确度(32位元)、双精确度(64位元)、
    分别是7和16个有效数字。我想float 和double应该至少满足这个标准,当二进制能精确表示这个十进制小数时,比如小数点后面有十位,那么就会输出十位,如果不能精确表示,那就截取精度的位数(或者可能比精度多一位。)
      

  6.   

    java大部分还是换标准来的,不过lang包的Math类的static long round(double a) 和static int round(float a) 方法没优秀的银行家舍入标准的四舍六入五留双,要想用这个标准需要用math包的BigDecimal类另外与java不同的是有的语言在浮点运算时,处理器内部计算的中间结果,为了保持精确,而加长了精度,而这样的后果是计算结果与工业标准的计算结果不同。java是符合工业标准的。
      

  7.   

    java大部分还是标准来的,打错个字
      

  8.   


    double d = 0.1234567890123456789d;
    System.out.println(d);
    double d1 = 1;
    double d2 = 3;
    System.out.println(d1/d2);是精确到16位。
    0.12345678901234568
    0.3333333333333333感谢你们的回答,结帖!