Java浮动意外舍入

时间:2012-02-17 14:09:43

标签: java floating-point floating-accuracy

我正在使用一个浮点常量并将对象私有浮点变量设置为下面的浮点常量,但是当对象输出它设置的值时,它会向上舍入浮点数中的最后一位数。

private final float RF_FREQUENCY = 956.35625f;
Object o = new Object();
o.setRFFrequency(RF_FREQUENCY);
System.out.println(o.getRFFrequency);

输出:956.35626

对象中的变量声明为protected float rfFrequency;,下面是getter和setter。

public float getRFFrequency() {
        return rfFrequency;
    }
public void setRFFrequency(float value) {
        this.rfFrequency = value;
    }

知道为什么会这样吗?

3 个答案:

答案 0 :(得分:3)

因为单精度IEEE754浮点数只有23位精度(24包括开始时的隐含1位)。

相当于大约七位小数,你可以看到你的号码中有八位数。

所有发生的事情是,计算机正在选择与您所要求的最接近的数字。

如果您需要更高的精度,请使用双精度。这给你52/53位,相当于大约15位十进制数。

答案 1 :(得分:2)

浮点数不能代表每个数字,因此数字是四舍五入的。双打是相同的,但具有更高的精度。如果你使用Double,你的输出将是956.35625(在这种特殊情况下)。

答案 2 :(得分:1)

经过一些测试,我得到了这个结果:

final float RF_FREQUENCY = 956.35625f;
System.out.println(String.format("%.5f", RF_FREQUENCY));
final BigDecimal xRF_FREQUENCY = new BigDecimal(956.35625);
System.out.println(String.format("%.5f", xRF_FREQUENCY));

输出结果为:

956,35626
956,35625

因此,正如coderanchblog post中详细解释的那样,我建议您更改为BigDecimal

编辑:我在stackoverflow中发现了另一篇关于同一问题的帖子Double vs. BigDecimal?希望它可以帮到你。