我正在使用浮点常量并将对象私有(private)浮点变量设置为下面的浮点常量,但是当对象输出其设置的值时,它会将浮点中的最后一位数字向上舍入。
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;
}
知道为什么会发生这种情况吗?
最佳答案
因为单精度 IEEE754 float 只有 23 位精度(24 位,包括开头隐含的 1 位)。
这大约相当于七位十进制数字,您可以看到您的号码中有八位数字。
所发生的一切是计算机正在选择它可以表示的最接近您所要求的数字。
如果需要更高的精度,请使用 double 。这为您提供了 52/53 位,相当于大约 15 位十进制数字。
关于Java 浮点意外圆角化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329710/