【问题标题】:Java float unexpectedly roundedJava 浮点数意外舍入
【发布时间】:2012-02-17 14:09:42
【问题描述】:

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

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;
    }

知道为什么会这样吗?

【问题讨论】:

  • 至少是第二次问这个问题就在今天
  • 最好将float 更改为BigDecimal,基于@JBNizet 的帖子
  • 使用this online calculator为自己寻找答案。
  • @JBNizet 抱歉,我进行了搜索,但没有看到与我提出的问题完全一样的内容。不过感谢您的链接。

标签: java floating-point floating-accuracy


【解决方案1】:

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

这相当于大约七位十进制数字,您可以看到 您的 号码中有八位数字。

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

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

【讨论】:

  • 那么如何继续使用浮点数并输出预期值 - 956.25625?
  • 不会使用float,但是,如果“float”指的是一般浮点而不是特定类型,则可以使用double
  • @TyC final float RF_FREQUENCY = 956.35625f; System.out.println(String.format("%.5f", RF_FREQUENCY));
  • ...也就是说,@TyC,你真的不能。您不能将 956.25625 存储在 float 中,而不会将其四舍五入到最接近的 二进制分数,精度为 23 位。
  • 你根本不能将 26 位放入 23。直到它是浮点数,而不是 rar 存档。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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
    

    因此,正如coderanch 和此blog post 中的详细说明,我建议您更改为BigDecimal

    编辑:我在 stackoverflow Double vs. BigDecimal? 中发现了另一篇关于相同问题的帖子,希望对您有所帮助。

    【讨论】:

    • 只有当双精度不能提供所需的精度(例如加密算法)时,我才会使用 BigDecimal。我还没有测试过,但我确信 BigDecimal 上的计算比 double 上的计算更昂贵(尤其是在 64 位机器上)。
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2021-03-20
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多