【问题标题】:Comparing double and int [duplicate]比较 double 和 int [重复]
【发布时间】:2013-07-30 00:20:16
【问题描述】:

对于此代码:

double foo = 100.0;
...
// foo may or may not change value here
...
if (foo == 100) {  // will this ever be true?
    ....
}

是否会调用 if 块?如果不是,检查foo == 100.0是否正确的方法是什么?

【问题讨论】:

    标签: java floating-point int


    【解决方案1】:

    试一试,伙计……

    public class Test
    {
       public static void main(String[] args)
       {
          double foo = 100.0;
    
          if (foo == 100) 
          {
             System.out.println("true");
          }
       }
    }
    

    输出:

    true
    

    【讨论】:

    • 即使它改变了价值?你还没有回答问题。
    • 问题是它是否会评估为真。我回答的是哪个?
    • @EJP:是的,即使它改变了值,只要在评估条件时设置为 100。
    【解决方案2】:

    是的,可以调用。测试可以是true。如果foo 不受影响(或重新分配给100.0),则比较将成功。

    但它只会成功,因为100.0 有一个精确 表示为double,并且int100 将被转换为相同的100.0 double通过扩大原始转换获得价值。

    使用== 比较double 值是正确的,因为某些double 值是精确文字的不精确表示(例如0.1 不精确地表示为double )。

    比较double值的最佳方法是确保这些值在彼此的某个(低)容差值内,as JUnit does

    assertEquals(双倍预期,双倍实际,双倍增量)

    这可确保expectedactual 值在公差值delta 内。

    【讨论】:

    • 它不仅会成功,因为 100 具有精确的双精度表示。无论使用什么值,都将在赋值和比较中以相同的方式转换为double。例如,4611686018427387903L 不能完全表示为 double,但比较结果仍然正确。
    • 建议使用容差进行比较是不恰当的建议,因为它减少了不平等的虚假报告,但代价是增加了平等的虚假报告,而且您不知道这对于您一无所知的应用程序是否可以接受。应用程序可能对寻求不平等而不是寻求平等“更感兴趣”,或者可能需要满足其他规范。
    • @EricPostpischil 您关于使用公差是不恰当的评论是不正确的;请参阅stackoverflow.com/questions/1088216/…。同样的点也适用于double 值。
    • 您提供的链接中有什么让您认为建议人们使用公差是个好主意?我所看到的只是神话的更多重复,而没有任何解释他们如何处理越来越多的虚假平等报道的后果。与容差比较成本,它可能导致应用程序失败,并且您无法知道它是否是对未知数的好建议应用程序。
    • 如果您使用该帖子来备份您的答案,那么最好将问题标记为 dup 而不是添加另一个答案。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多