好的。我已经把头撞到墙上了大约 2 个小时,试图弄清楚为什么世界double answer = 364/365;
上告诉我那answer
是 0。或者任何其他的组合double
,它只是截断小数,我只是不知道为什么。
5 回答
364/365 执行整数除法(截断小数)。
尝试double answer = 364.0/365;
强制它执行浮点除法。
就像是:
double days_in_year = 365;
double answer = 364/days_in_year;
也可以,因为其中一个操作数不是整数。
您正在使用一个 int 类型 (364) 并除以另一个 int 类型 (365) - 答案将是一个 int。然后将其存储在双类型答案中。您可以执行以下操作:
double answer = 364d / 365d;
更多信息在这里:
你需要做双除法。现在 Java 将其解释为整数除法并返回 truncated int
。
你需要的是:
double answer = 364 / 365.0;
或者
double answer = 364 / (double) 365;
原因是 java 中整数文字的默认类型是int
,所有int
基于算术的所有结果都被类型转换回int
. 因此,虽然你的答案是 0.997,但当它被类型转换回来时,它变成了 0:
(int)0.997 = 0
所以你可以这样做:
364.0/365.0
或者
((float)364)/365
以上所有答案都是正确的,只是想补充一点,这都是关于 GIGO 的。
double answer = 364/365;
在上面的代码中,双精度类型意味着只回答变量,而算术表达式有两个 int 类型的操作数。所以算术表达式的输出也是 int 类型,然后通过自动向上转换为 double 类型给出输出 0.0,就像下面的例子:
double ans = 4.0/0;
上面的代码将输出 Infinity 作为操作数之一是浮点数,因此通过自动类型转换 0 转换为 0.0 并且结果是根据浮点数据类型。
然而
double ans = 4/0;
将在运行时给出 java.lang.ArithmeticException: / 零异常,因为两个操作数都是 int 数据类型,因此无论 ans 变量数据类型是否为 double,输出都是根据 Integer 数据类型。