对于人类来说,以下代码不正确:
double d = 0.7F;
System.out.println( d );
打印值:0.699999988079071
以下代码更好用:
double d = Double.valueOf( Float.toString( 0.7F ));
System.out.println( d );
但是创建一个额外的String。没有额外的字符串,是否有更多的性能转换为float?
代码行很简单,只展示了问题。该计划更复杂。浮点值位于复杂模型的一部分中。格式化图层仅使用double。此外,DecimalFormat只接受double而不是float。
答案 0 :(得分:5)
是的,使用
double d = 0.7D;
使用F
表示它是float
常量,然后它被提升为double
,可能不是最接近0.7的数字,可用双精度浮点表示,如尾数不会以任何方式延长。
0.7D
开头是double
常量。
答案 1 :(得分:2)
如果关于输出(对于人类),我建议使用printf:
System.out.printf("Value: %.2f", d);
使用FloatingDecimal进行转换肯定更快,并且还打印0.7
Double doubleResult = new FloatingDecimal(0.7F).doubleValue();
答案 2 :(得分:2)
但是创建一个额外的String。没有额外的字符串,是否有更多的性能转换为float?
分配几个字节的短暂块只是冰山一角。你想要的“转换”从根本上要求从二进制浮点到十进制表示然后再回到二进制浮点,这些转换都不便宜,无论中间十进制表示如何存储。
如果你知道你所关注的float
值来自点后两位数的十进制值,你可以使用:
double d = Math.round(f * 100.0) / 100.0;
这只会产生一个除Math.round
的除法,这比一次转换或从十进制转换便宜。任何体面的编译器都应该为它生成不分配的代码。
答案 3 :(得分:2)
如果你知道你想要什么样的精度,你可以将它四舍五入到小数点后6位。例如
public static double round6(double x) {
return Math.round(x * 1e6) / 1e6;
}
round6(0.7f) == 0.7
如果此精度合适,传入的x
为float
并不重要。
答案 4 :(得分:2)
double d = 0.7F;
System.out.println( d );
打印值:0.699999988079071
转换正确。
当你打印出float f
时,它打印出足够的数字,这样它打印出来的值比任何其他f
的真值更接近float
1}}。
当您打印出double
时,它会打印出足够的数字,以便打印出来的值更接近d
的真实值,然后是其他任何double
。
从float到double的转换是准确的,它只是显示一个更接近float
中的真实值的值。 Double.valueOf( Float.toString( 0.7F ))
并不准确;它只是假装你的价值比实际更好。