我最近遇到了以下好奇心:
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 投射不起作用!!
答案 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以获取可以更好地控制格式化输出的替代方案。