连接字符串时从 Double 转换为 Float 时的精度?

Precision when Casting from Double to Float while concatenating String?

我最近运行在以下好奇:

    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

为什么在计算 ss2 时不可能有一个漂亮的浮点数? 为什么在 ss2 的情况下它仍然是 double?

PS:我认为这个问题与数字格式无关。我真的很想知道为什么 (float)d 演员表不起作用!!

您的表达式 precision.equals("float") ? (float)d: d 无效,因为条件运算符只有一个结果类型,如果一个参数的类型为 float 而另一个参数的类型为 double 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 以寻找可以更好地控制格式化输出的替代方案。