在连接String时从Double转换为Float时的精度?

时间:2017-06-21 17:41:47

标签: java casting double precision

我最近遇到了以下好奇心:

    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

为什么在计算 s s2 时不可能有漂亮的浮动? 为什么在 s s2 的情况下它仍然是双倍的?

PS:在我看来,这个问题与数字格式无关。我真的很想知道为什么(浮动)d 投射不起作用!!

1 个答案:

答案 0 :(得分:3)

您的表达式precision.equals("float") ? (float)d: d无效,因为条件运算符只有一个结果类型,如果一个参数的类型为double而另一个参数的类型为{float,则为double 1}}。

因此,第一个替代方案将从float扩展到double,而从double转换为float并返回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以获取可以更好地控制格式化输出的替代方案。