【问题标题】:How do I compare floating point numbers如何比较浮点数
【发布时间】:2013-05-13 22:29:23
【问题描述】:

请原谅问题中明显的“我可能应该已经知道这个”元素,但我没有看到一种方法可以让我通过这个评估的除法方面来让结果恢复为真。

我正在寻找一个函数,它将结果作为特定精度的浮点数返回,以便以下工作......

float a = 0.66;

if( magicPrecisionFunction(2.0f/3.0f , 2) == a){ //the 2 specifies the level of precision
   //something
}

我意识到我可以在 2 分钟内自己编写此代码,但我希望找到一种 Java 本地方式来“正确”执行此操作。

【问题讨论】:

  • 使用 double 或 float,您将永远无法获得浮点数的精确值。如果您想处理这些数字,请改用BigDecimal。很抱歉,但是是的,这是一个你应该已经知道了
  • 我不认为你的意思是无理数。您可以在浮点类型中表示的每个有限数都是有理数。
  • AFAIK 你可以对结果进行四舍五入。如果您看到java.math.BigDecimal 文档,您可以使用BigDecimal#setScale 实现此目的
  • 啊!这就是 BigDecimal 的秘密。很高兴知道!非常感谢。
  • 能否将标题更改为“我如何比较有理数” :) 我已经尝试编辑但被拒绝了。

标签: java floating-point


【解决方案1】:

如果您想要精确,我不会使用 float,因为 double 更容易编写,并且可以提供五万亿倍的准确度。

类似于@rofl 的示例

int n = 2, d = 3;
if ((long)(100.0 * n / d) == 66) {
  ...
}

这不仅比使用 BigDecimal 快约 100 倍,而且代码更短。

顺便说一句,将 double 转换为 BigDecimal 的正确方法是使用 valueOf

BigDecimal bd = BigDecimal.valueOf(0.1);
System.out.println(bd); // prints 0.1

【讨论】:

    【解决方案2】:

    如何靠近...

    if (Math.round(100.0f * 2.0f/3.0f) == 66) {
      ..
    }
    

    编辑:啊……没抓住重点……不是圆的,而是截断的。在这种情况下:

    if ((int)(100.0f * 2.0f / 3.0f) == 66) {
      ...
    }
    

    【讨论】:

    • 是什么让你认为它不能返回 67?
    • 是的,我认为 Math.floor 会起作用,而且正如我所说,我可以自己编写类似的东西,但我很好奇是否有内置的 Java 机制来处理这个问题。
    • BigDicimald 是大锤的答案,大而 。 Yoy 会在一个紧密的循环中注意到影响....
    【解决方案3】:

    您可以使用BigDecimal,它会完全满足您的需求, 您可以创建所需的数字并使用 MathContext 设置精度

        BigDecimal b1 = new BigDecimal("2.0");
        BigDecimal b2 = new BigDecimal("3.0");
        BigDecimal ans = b1.divide(b2, new MathContext(2)); // 2 is precision
    

    【讨论】:

    • 有趣。你传入一个字符串来取回你的结果对象?
    • 你不用传字符串,这个构造函数可以带很多类,看看吧
    • @Dr.Dredel 因为如果你传递doublefloat BigDecimal 实例将使用错误的数字,即 0.1 可能是 0.9999999...
    • 是的,双打非常糟糕,如果您需要精确计算,您应该始终使用 BigDecimal
    • @Dr.Dredel 如果您将从事金融应用工作,这一点至关重要(只是为了让您知道并且不想破坏金融系统 (= )。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多