Java整数 - 双重分裂混淆

时间:2015-09-14 18:55:17

标签: java

计划1

int sum = 30;  
double avg = sum / 4; // result is 7.0, not 7.5 !!!

VS

计划2

int sum= 30   
double avg =sum/4.0 // Prints lns 7.5

这是因为' 4'在程序1中充当一个字面整数?所以30/4会给我7.但是由于这个数据类型是double,我们需要添加.0到end。所以' 7.0'

程序2有4.0,它充当文字双。 int / double总是会给出double,因为它更精确。所以我们得到7.5'。我不明白双重数据类型对结果的影响但是......由于双数据类型的条件已经满足,它实际上不需要做任何事情。(具有最精确的结果)计算)。

我错了吗?我鼓励你纠正我!这就是我学习的方法.. :)

5 个答案:

答案 0 :(得分:6)

这是一个整数除法(因为它涉及两个整数)

int sum = 30;  
double avg = (sum / 4); // result is 7

整数除法,将向下舍入到最接近的整数。

然而,这是一个双重划分(因为4.0是双倍的)

int sum= 30   
double avg = (sum/4.0) //  result is 7.5

这是预期的行为,转换都已明确定义。无需猜测。请查看有关转化的java docs

  

将int或long值的扩展转换为float或long   值加倍,可能导致精度损失 - 即结果   可能会丢失该值的一些最低有效位。在这   case,生成的浮点值将是正确舍入的   使用IEEE 754舍入到最接近模式

的整数值的版本

答案 1 :(得分:6)

在你的第一个例子中:

int sum = 30;
double avg = sum / 4; // result is 7.0, not 7.5 !!!

sum是一个int,4也是一个int。 Java将一个整数除以另一个整数并获得整数结果。这一切都发生在之前它将值分配给double avg,到那时你已经丢失了小数点右边的所有信息。

尝试一些演员。

int sum = 30;
double avg = (double) sum / 4; // result is 7.5

OR

int sum = 30;
double avg = sum / 4.0d; // result is 7.5

答案 2 :(得分:2)

在java中,涉及仅整数类型(int,long等)的操作具有整数结果。这包括分歧。

30和4都是整数值,因此如果您尝试除以它们,则使用整数除法。

但是,如果您尝试30.0/430/4.0,则结果将为7.5,因为您将使用浮点除法。

变量avg的声明类型对结果没有影响。小数部分在除法期间丢失,而不是在将值赋给变量时丢失。

答案 3 :(得分:0)

enter image description here

图片取自:http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/04/mixed.html

请参阅上面的网址以获得更清晰的解释。

答案 4 :(得分:0)

计划1 在Java中,当您在两个整数之间进行除法时,结果是整数。因此,当你执行sum / 4时,结果是整数7.然后将该整数分配给一个double变量,这样7变为7.0。

计划2 在Java中,当您在整数和double之间进行除法时,结果是double。所以当你总和/ 4.0时,结果是双7.5。然后你将它分配给一个双变量,所以它仍然是7.5。

所以问题不在于println如何打印变量,而是如何在Java中使用分区