我正在Java应用程序中尝试这种简单的计算:
System.out.println("b=" + (1 - 7 / 10));
显然,我希望输出为b=0.3,但实际上却得到了b=1。
什么?! 为什么会这样?
如果我写:
System.out.println("b=" + (1 - 0.7));
我得到正确的结果,即b=0.3。
这是怎么了
对不起,我的分数很低,但这是一个基本问题,令我感到怀疑的是,该协议的一部分是通过回答来提高Stackoverlow的排名。 对不起,如果我错了。
您正在使用整数除法。
请尝试使用7.0/10。
麻烦补充说,这不是一个错误。它的一个功能。 :]
既没有错误也没有功能-它"按设计工作"。
如果要使用变量,则可以将其中任何一个强制转换为浮点型。 a = 1; b = 2; a / b = 0; (浮动)a / b = 0.5; a /(浮点)b = 0.5;
您在表达式7/10中使用了整数,并且整数7除以整数10为零。
您期望的是浮点除法。以下任何一项都会评估您的期望方式:
7.0 / 10
7 / 10.0
7.0 / 10.0
7 / (double) 10
请不要以此为答案。不是,而是与利用int和float的差异有关的建议。我可以将其放在注释下,但答案框允许我格式化此注释。
自从fortran以来(或更早),此功能已在所有受人尊敬的编程语言中使用-我必须承认我曾经是Fortran和Cobol打孔卡程序员。
例如,整数除以10/3会得出整数值3,因为整数不具有容纳小数残差0.3333的功能。
我们(以前的古老程序员)一直使用此功能的一种方式是循环控制。
假设我们希望打印一个包含1000个字符串的数组,但是我们希望在第15个字符串之后插入一个换行符,以便在该行的末尾和下一行的开始处插入一些漂亮的字符。假设整数k是该数组中字符串的位置,我们将利用这一点。
int(k/15)*15 == k
仅当k可以被15整除时才为true,即每15个像元的频率出现一次。这类似于我的朋友说他的祖父的死表一天两次准确。
int(1/15) = 0 -> int(1/15)*15 = 0
int(2/15) = 0 -> int(2/15)*15 = 0
...
int(14/15) = 0 -> int(14/15)*15 = 0
int(15/15) = 1 -> int(15/15)*15 = 15
int(16/15) = 1 -> int(16/15)*15 = 15
int(17/15) = 1 -> int(17/15)*15 = 15
...
int(29/15) = 1 -> int(29/15)*15 = 15
int(30/15) = 2 -> int(30/15)*15 = 30
因此,循环
leftPrettyfy();
for(int k=0; k
print(sa[k]);
int z = k + 1;
if ((z/15)*15 == z){
rightPrettyfy();
leftPrettyfy();
}
}
通过在循环中以奇异的方式改变k,我们可以打印出三角形打印输出
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
这就是要证明,如果您认为这是一个错误,则此"错误"是一项有用的功能,我们不希望将其从到目前为止使用的各种语言中删除。
由于mod(a,x)= a-(x * int(a / x)),我想答案就在于,除了重复构造参数堆栈以及代码jmp调用模子例程的负担外,您可以算出内联的a ==(x * int(a / x))比a-(x * int(a / x))== 0更有效。
我写了"通过在循环中以奇异的方式改变k,我们可以打印出三角形打印输出",因为k ==(k / L)* L。应该是这样的:"通过在循环中以奇异的方式改变L,我们可以打印出三角形的打印输出。"
FWIW,我在我的盒子上(运行JDK 1.6.0_38的2011年中2.8 GHz i7 Linux桌面)进行了测试,对于a = 1 .. 5亿,超过10次重复,(a % 15 == 0)平均大约1500ms,而大约1400ms对于(a == 15 * (a 15))。因此,除非并且直到您证明%是您在现代硬件上的热点,否则我认为最好写出您的意思。
"除非直到"?我们应该禁止VB,javascript和perl编程。
我发现字母标识符更具可读性,并且更能指示已解析的类型:
1 - 7f / 10
1 - 7 / 10f
要么:
1 - 7d / 10
1 - 7 / 10d
就我而言,我正在这样做:
double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1));
代替"正确":
double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);
注意括号!
本文探讨了Java中整数除法与浮点数除法的区别,解释了为什么`1-7/10`的结果是1而不是0.3。内容涉及整数除法的规则,以及如何通过类型转换避免此类问题。通过示例展示了整数除法在特定情况下的用途,并讨论了编程语言设计中这一特性的价值。

被折叠的 条评论
为什么被折叠?



