如何将浮点值舍入为double值?

时间:2014-12-26 21:19:25

标签: java floating-point double rounding rounding-error

对于人类来说,以下代码不正确:

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。

5 个答案:

答案 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

如果此精度合适,传入的xfloat并不重要。

答案 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 ))并不准确;它只是假装你的价值比实际更好。