计划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'。我不明白双重数据类型对结果的影响但是......由于双数据类型的条件已经满足,它实际上不需要做任何事情。(具有最精确的结果)计算)。
我错了吗?我鼓励你纠正我!这就是我学习的方法.. :)
答案 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/4
或30/4.0
,则结果将为7.5
,因为您将使用浮点除法。
变量avg
的声明类型对结果没有影响。小数部分在除法期间丢失,而不是在将值赋给变量时丢失。
答案 3 :(得分:0)
答案 4 :(得分:0)
计划1 在Java中,当您在两个整数之间进行除法时,结果是整数。因此,当你执行sum / 4时,结果是整数7.然后将该整数分配给一个double变量,这样7变为7.0。
计划2 在Java中,当您在整数和double之间进行除法时,结果是double。所以当你总和/ 4.0时,结果是双7.5。然后你将它分配给一个双变量,所以它仍然是7.5。
所以问题不在于println如何打印变量,而是如何在Java中使用分区