java中使用除法,关于Java中的简单除法:Java中的简单除法-这是错误还是功能?...

本文探讨了Java中整数除法与浮点数除法的区别,解释了为什么`1-7/10`的结果是1而不是0.3。内容涉及整数除法的规则,以及如何通过类型转换避免此类问题。通过示例展示了整数除法在特定情况下的用途,并讨论了编程语言设计中这一特性的价值。

我正在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);

注意括号!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值