【问题标题】:How do I express NaN for integer types in Java?如何在 Java 中为整数类型表示 NaN?
【发布时间】:2012-01-09 21:09:49
【问题描述】:

我有一个返回long 的方法,在某些情况下无法计算出有效结果。 Double 具有 NaN 常量,在 long 中无法表达。

我能想到两种解决方案:

  • 抛出异常
  • 将方法的签名更改为返回double,检查NaN,如果一切正常,则转换为long

是否更可取/更“Javanic”?还有其他方法/我错过了什么明显的东西吗?

【问题讨论】:

  • 您确实意识到在doublelong 之间进行转换是有损的?

标签: java types


【解决方案1】:

您可以将返回类型设为Longlong 的盒装版本)并返回null

【讨论】:

  • 我会考虑一个更糟糕的解决方案来抛出异常。特别是考虑到人们可能很想将返回值分配给long,这将导致令人讨厌的 NPE。
  • NullPointerException 并不讨厌。如果该方法返回 Long 并记录 null 是一个有效的返回值,则由调用者来检查 null。你认为 NPE 很糟糕的论点意味着程序员是坏的或懒惰的,这都不是不返回 null 的好理由。
【解决方案2】:

只需使用包装类(即java.lang.Integerjava.lang.Long),它允许null 值。

【讨论】:

    【解决方案3】:

    我会投票赞成抛出异常

    或者按照其他人的建议,返回空值

    【讨论】:

      【解决方案4】:

      我的想法是抛出一个异常,因为这表示一个错误——结果无法正确计算。不过,这只是一个意见问题。

      您返回的内容实际上取决于您的特定需求,以及哪些值是有效的。例如,如果有效数字只有 1 或更高,您可以使用 0 作为标志。或者您可以使用负数作为标志。

      或者,当我键入此内容时,我看到答案已发布,建议返回 Long 并将其设置为 null。然后可以自动装箱。这也是一个完全正确的答案。

      如果您需要从您的方法返回更多数据,您甚至可以定义您的自定义类,该类可以包含 long 和其他包含有关计算或结果的数据的属性。

      但同样,我个人的偏好是例外。

      【讨论】:

        【解决方案5】:

        任何返回 NAN 的应用程序都不符合设计视角,因为 NAN 意味着发生了异常情况,因此您应该抛出 IllegalStateException 或 EntityNotFoundException 之类的异常,以便调用者知道发生了什么而不是 NAN。

        如果您的应用程序接受大于 0(零)的所有值作为有效值,那么您可以返回负数而不是 NAN,这将表明到达了不常用的路径,如果您不希望抛出异常,尽管我觉得抛出异常在这种情况下最好,

        【讨论】:

          【解决方案6】:

          与大多数此类问题一样,没有对错之分,答案是“视情况而定”。

          重要的是要考虑为什么无法计算出有效结果。如果是因为输入无效,那么您应该抛出 IllegalArgumentException。

          如果是由于其他原因在正常情况下不应该发生,那么其他一些例外情况可能是合适的。

          您可以考虑一些不能作为有效返回值的长值并使用它来指示错误。

          否则,Pollex 先生使用 Long 和 null 返回的解决方案也值得考虑。答案也取决于对大多数来电者来说什么是方便的。

          【讨论】:

            【解决方案7】:

            我不建议使用 null 来表示 NaN 值。如果您跳过 null 检查,稍后很容易导致 NullPointerException。 (并且由于隐式拆箱,这种 NullPointerException 很难发现。您可能无法直接看到什么可以为 null。)否则,对 NaN 值进行操作是有意义的:NaN+x=NaN,NaN*x=NaN。

            在我看来,抛出异常、使用双精度(顺便支持 NaN)或使用自己的类更好。

            【讨论】:

              【解决方案8】:

              我使用 MIN_VALUE 来表示 longint 类型的 NaN。这需要额外检查,在某些情况下可能很有用。

              【讨论】:

                【解决方案9】:

                这很容易显示NaN的值,只要定义一个double类型的var然后像这样赋值给它

                double identifier = java.lang.Double.NaN;
                

                我有同样的情况,所以我使用它并且它有效。 如果未定义直接路径,则必须找到一种解决方法..

                【讨论】:

                • 问题是关于整数类型的。
                • Integer 也可以这样使用。
                猜你喜欢
                • 2019-02-25
                • 2015-03-06
                • 2020-11-04
                • 2011-06-22
                • 2015-01-15
                • 2017-11-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多