Java双除法正数

Posted

技术标签:

【中文标题】Java双除法正数【英文标题】:Java double division positiveness 【发布时间】:2021-11-07 09:52:24 【问题描述】:

为什么这段 java 代码会产生正无穷大?

    double d = 10.0 / -0; 

    System.out.println(d);
    if (d == Double.POSITIVE_INFINITY) 
        System.out.println("Positive Infinity");
    else 
        System.out.println("Negative Infinity");

【问题讨论】:

因为你除以零。 负零?零不能为负数。 @David 在数学上你是对的。在计算中不一定。 Java 和许多其他编程语言将-0.0 识别为与0.0 不同的值。我承认这可能会令人困惑。 【参考方案1】:

虽然double 区分正零和负零,但int 不区分。因此,当您将值为 0 的 int 转换为 double 时,您总是得到“正零”。

-0 是一个int,它的值为0。

除以“负零”得到负无穷大。为此,您需要将除数指定为double(而不是int):

    double d = 10.0 / -0.0;

    System.out.println(d);
    if (d == Double.POSITIVE_INFINITY) 
        System.out.println("Positive Infinity");
     else 
        System.out.println("Different from Positive Infinity");
    
    if (d == Double.NEGATIVE_INFINITY) 
        System.out.println("Negative Infinity");
     else 
        System.out.println("Different from Negative Infinity");
    

输出:

-Infinity
Different from Positive Infinity
Negative Infinity

【讨论】:

【参考方案2】:

负零等于零。因此,

double d = 10.0 / -0;

等价于

double d = 10.0 / 0;

这是正无穷大。

另一方面,如果你有:

double d = 10.0 / -0.0;

您将得到负无穷大(因为现在第二个值是双精度数,用于区分正/负零)。

【讨论】:

谢谢! “double d = 10.0 / -0f;”让我更加困惑。产生负无穷大。为什么 0 作为浮点数会变成负数? 是的,就像@Ole V.V.指出,double/int 确实很重要。我已经编辑了我的答案以更好地回答这个问题【参考方案3】:

这一输出是double d = 10.0 / -0; ===> 正无穷

但是如果你需要为输出获得负无穷大,你可以改变这个代码.....

double d = 10.0 / -0.0;

现在,您可以获得“负无穷大”的输出。

原因 --->(数据类型。 首先你使用 double/int.... 第二个选项是双/双..... )

【讨论】:

以上是关于Java双除法正数的主要内容,如果未能解决你的问题,请参考以下文章

java里怎么算除法?

JAVA 中除法后小数精度问题

标量的OpenCV双矩阵除法产生不正确的结果

PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

python中整数除法的基本含义是啥?

什么是 MATLAB 中的双周期运算符后跟除法运算符 (../)?