2017-06-21 60 views
0

我最近碰到下面的好奇心:当从串联到字符串连接时从双精度到浮点精度?

double d=0.8608278036117554; 
    String precision="float"; 

    float f=(float)d; 
    String s="a " + (precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s2="a " + String.valueOf(precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s3="a " + (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) + " Bonjour"; 


    println(d); 
    println(f); 
    println(s); 
    println(s2); 
    println(s3); 


//0.8608278036117554 
//0.8608278 
//a 0.8608278036117554 Bonjour 
//a 0.8608278036117554 Bonjour 
//a 0.8608278 Bonjour 

为什么不能有一个很好的浮动计算时小号S2? 为什么在ss2的情况下仍然是双倍的?

PS:在我看来,这个问题与数字格式无关。我真的很想理解为什么(float)d演员不工作!

+1

“boolean?”的结果? float:double'是一个'double'这是铸造浮起来的,但是它正在被转换成一个double。 –

回答

3

你的表达precision.equals("float") ? (float)d: d没有任何效果,作为条件运算符具有一个单一的所得类型,这是double如果一个参数具有类型float,而另一个具有类型double

所以第一替代将从float差扩大到double和在转换从doublefloat和回double可能对值的影响,将String.valueOf(double)在任一情况下被调用。

您可以使用(precision.equals("float") ? String.valueOf((float)d): String.valueOf(d))替代,其方法调用不是多余的,因为它们是调用不同的方法String.valueOf(float)String.valueOf(double)

也就是说,你不应该使用缩小到float来控制输出。 检查Format Float to n decimal places提供更多控制格式化输出的替代方案。

+0

我现在明白了。但是,如果它被抛到了一个浮点上并且翻倍,那么精度怎么会不会丢失呢?我不应该在最后有一堆零而不是真正的双精度小数? – Myoch

+1

'float'和'double'的精度是用* binary *数字来定义的,而不是十进制数字。对于某些值,这种转换可能会截断某些非零位(这就是为什么我说* *可能影响该值),但结果值不一定是小数位数较少的值。 – Holger

+0

事实上,我已经尝试了来回演出,与整个“弦乐”的东西分开,我得到了同样的浮法。所以如果我理解的很好,这真是一个巧合,导致回到同样的双倍,并且我选择了另一个例子,我可以发现数字的变化,对吧? – Myoch