我编写了一些计算内容(我在下面复制了一个非常简化的例子),例如CASE2,并得到了不好的结果。像CASE1一样重构代码并且工作正常。我知道CASE 2中有一个隐含的演员,但不确定完整的原因。 任何人都可以解释我下面究竟发生了什么?
//CASE 1, result 5.5
double auxMedia = (5 + 6);
auxMedia = auxMedia / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
//CASE 3, result 5.5
double auxMedia3 = (5.0 + 6.0) / 2.0;
//CASE 4, result 5.5
double auxMedia4 = (5 + 6) / 2.0;
我的猜测是,CASE2中的/ 2正在将(5 + 6)转换为int并导致舍入为5,然后再次转换为double并转换为5.0。
CASE3和CASE 4也解决了这个问题。
答案 0 :(得分:13)
答案 1 :(得分:5)
为了扩展Marc(正确)的答案,整数被解释为整数,而带小数的数字被解释为double。要将整数声明为文字双精度数,请在其上附加“D”:
//CASE 2b, result 5.5
double auxMedia2b = (5D + 6D) / 2;
答案 2 :(得分:1)
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
(5 + 6)操作的结果是整数。因为两个操作数都是整数类型。然后,编译器执行11/2,其中两个操作数也是整数。最后一次除法的结果显然是5,因为它是一个整数除法(不知道正确的英文单词)。
答案 3 :(得分:1)
你是对的。 CASE 2使用整数运算,直到进行赋值。您还可以通过进行显式转换来解决问题:
double auxMedia1 = ((double) (5 + 6)) / 2;