当前位置: 首页 > 知识库问答 >
问题:

为什么不进行整数和双操作数的数字升级?

公羊俭
2023-03-14

在最近的工作中,我遇到了一个问题,是关于一些操作数的数字提升。以下是演示代码:

int num1 = 9999999;
int num2 = 65536;
double result = num1*num2*1.0;

在我看来,我以为Num1和Num2都会自动提升到两倍,然后计算结果为其中一个操作数是两倍,而结果震惊了我。我得到了一个负数。然后我看了JLS,它还说它应该做数字推广,见下文:

"如果二进制运算符的操作数中至少有一个是浮点类型的,则该操作是浮点操作,即使另一个是整数。

如果数值运算符的操作数中至少有一个为double类型,则使用64位浮点运算执行该运算,数值运算符的结果为double类型的值。如果另一个操作数不是double,则首先通过数字提升(§5.1.5)将其加宽为double。

否则,使用32位浮点算法执行该运算,数值运算符的结果为float类型的值。(如果另一个操作数不是浮点,则首先通过数字提升将其加宽为类型浮点。)"

如果我把结果改成1.0*num1*num2,它会给出正确的答案。谁能告诉我这到底是什么。

共有2个答案

徐兴昌
2023-03-14

这与运算符优先级有关,

在您的例子中,发生的是num1和num2是整数,首先计算它们,它们的结果也是一个整数,因为结果超出范围,因此您得到的结果是负数,下一步是与1.0相乘。在这里,正如您所期望的,结果被提升为双倍。但现在我们意识到为时已晚。

你可以试试这些

result=num1*1.0*num2;
result=1.0*num2*num1;
result=1.0*num1*num2;
乐正涵意
2023-03-14

否,num1*num2的结果提升为双精度。您的声明相当于:

double result = (num1 * num2) * 1.0;

因此,对于推广,这将是:

int firstMultiplication = num1 * num2;
double promoted = firstMultiplication;
double result = promoted * 1.0;

基本上,这只是操作员优先级的问题。数字提升发生在操作数上——不是所有的表达式都参与了计算操作数。

 类似资料:
  • 问题内容: 有人可以解释一下吗(直接来自文档-强调我的): math.ceil(x) 以浮点数形式 返回 x 的上限,最小 整 数值大于或等于x。 math.floor(x) 以浮点数形式 返回 x 的下限,即小于或等于x的最大 整 数值。 为什么会和回报花车当它们被定义应该算整数? 编辑: 好吧,这有一些很好的论据来说明为什么它们 应该 返回浮点数,而当@jcollado指出它们实际上 _确实_

  • 问题内容: 我有tyo字节变量 如果我将它们求和,则求和的值为整数。 为什么a + b是int? 问题答案: 因为Java语言规范这么说 对操作数(第5.6.2节)执行二进制数值提升。 请注意,二进制数值升级执行值集转换(第5.1.13节),并且可能执行拆箱转换(第5.1.8节)。 数字操作数上加法表达式的类型是其操作数的提升类型。 并且,关于数字促销, 扩展原语转换(第5.1.2节)适用于转换以

  • 我正在学习Java,刚刚发现了这个关于该语言的微妙事实:如果我声明两个具有相同元素的整数数组,并使用比较它们,结果是。为什么会出现这种情况?比较值不应该为吗? 提前感谢!

  • 我有数据。该表名为enc.per。每天的遭遇日。它有2403行,其中指定了服务日期和当天就诊的患者数量。我想看看在工作日中任何一种类型的患者的中位数。 这一行给出了一个错误 < code >[. data . table (enc . per . day,,list(patient . enches = median(n)),:j的列的计算结果与每个组的类型不一致:组4的结果具有类型为“integ

  • 我有 tyo 字节变量 如果我对它们求和,sum的值是整数。 为什么 b 是整数?

  • 问题内容: 我对为什么Integer和int可以在Java中互换使用感到困惑,即使一个是原始类型,而另一个是对象也是如此? 例如: 要么 问题答案: 发布的文章的前几句话很好地描述了它: 您不能将int(或其他原始值)放入集合中。集合只能容纳对象引用,因此您必须将原始值装箱到适当的包装器类中(在int情况下为Integer)。当您从集合中取出对象时,您将得到放入的Integer。如果需要一个int