[英]How to round a float value to double value?
对于人类,以下代码错误地四舍五入:
double d = 0.7F;
System.out.println( d );
打印值:0.699999988079071
以下代码可以更好地工作:
double d = Double.valueOf( Float.toString( 0.7F ));
System.out.println( d );
但是创建一个额外的字符串。 在没有额外的字符串的情况下,float有更多的性能转换成double吗?
代码行很简单,仅演示了问题所在。 该程序更复杂。 浮点值位于复杂模型的一部分中。 格式化层仅使用double。 此外,DecimalFormat仅接受双精度而不是浮点型。
是的,使用
double d = 0.7D;
使用F
表示它是一个float
常量,然后将其提升为double
并且可能不是可以用双精度浮点表示的最接近0.7的数字,因为尾数没有任何方式扩展。
0.7D
是一个double
常量。
如果这一切都是关于输出(对于人类),我建议使用printf:
System.out.printf("Value: %.2f", d);
使用FloatingDecimal进行转换肯定会更快,并且还会打印0.7
Double doubleResult = new FloatingDecimal(0.7F).doubleValue();
但是创建一个额外的字符串。 在没有额外的字符串的情况下,float有更多的性能转换成double吗?
分配一个短暂的几个字节的块只是冰山一角。 从根本上讲,您希望进行的“转换”需要从二进制浮点数转换为十进制表示,然后再回到二进制浮点,并且这些转换并不便宜,无论中间十进制表示形式如何存储。
如果您知道所关心的float
值来自点后两位两位的十进制值,则可以使用:
double d = Math.round(f * 100.0) / 100.0;
这只会产生一个除法Math.round
,再加上Math.round
,这比一次转换为十进制或从十进制转换便宜。 而且任何体面的编译器都应为其生成未分配的代码。
如果知道所需的精度,可以四舍五入为小数点后六位。 例如。
public static double round6(double x) {
return Math.round(x * 1e6) / 1e6;
}
round6(0.7f) == 0.7
只要此精度合适,传入的x
就是float
并不重要。
double d = 0.7F;
System.out.println( d );
打印值:0.699999988079071
转换正确。
当您打印float f
,它会打印出足够的数字,因此它所打印的值比其他任何float
都更接近f
的真实值 。
当您打印出一个double
,它会打印出足够的数字,因此它打印出来的值比其他double
值都更接近d
的真实值。
从float到double的转换是准确的,它只是向您显示一个更接近float
真实值的值。 Double.valueOf( Float.toString( 0.7F ))
不太准确; 它只是假装您的价值比实际价值要好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.