有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

双常量的java比较

我对此进行了大量的研究,我对双打中的精确误差有所了解;但是我找不到答案。我的问题是:比较双常数是否总是安全的?我的意思是,从字符串中读取double或在源代码中创建double。不会对其进行任何操作(加法、减法等)。如果我创建一个变量,比如

双c=3.0

下列等式是否总是正确的?c==3.0000

例如,是否有可能看到像这样的方程式的错误计算1.23456789<;1.23456788?


共 (2) 个答案

  1. # 1 楼答案

    它总是安全的;有一个警告

    下面是一个例子:

    1.232342134214321412421 == 1.232342134214321412422
    

    这是真的;所有双精度常数都会自动四舍五入到最接近的可表示双精度,对于这两个数字,它都是相同的双精度

    因此,给定两个实际的数学数A和B,其中A < B,然后如果将这些数字转换为双文本,并在其上运行这3个表达式,则会出现以下情况:

    如果A和B四舍五入到不同的双精度,您将得到保证:

    • A < B将是真的
    • A == B将为假
    • A > B将是错误的

    如果A和B非常接近,它们可能会变成同一个双精度,你会得到:

    • A < B将为假
    • A == B将是真的
    • A > B将是错误的

    换句话说,“小于”和“大于”可以弯曲成相等,但较小的数字永远不会被错误地视为较大

  2. # 2 楼答案

    For example is there any possibility to see wrong evaluation of an equation like this 1.23456789 < 1.23456788?

    是的,这是可能的,因为您可以编写任意位数的浮点文本,当编译器解释它们时,它们将被近似为适合double的最接近值

    例如:

    boolean result = 1.2003004005006007008009 > 1.2003004005006007008008;
    System.out.println(result);
    

    打印false,即使在数学上第一个数字大于第二个数字(因此您希望它打印true

    总之:通过使用浮点文字值,您不会突然拥有任意精度的浮点数