为什么Java的划分被打破了?
我是一名经验丰富的php开发人员,刚刚开始学习Java。目前我正在学习林达的一些课程,我还处于真正的初级阶段。我正在编写示例程序,要求用户输入,并进行简单的计算
昨天我遇到了这样的情况:
double result = 1 / 2;
用我的穴居人大脑,我会想^{
事实上,这让我很害怕。我忍不住认为这是非常坏的。认为整数除法得到整数是非常天真的。我认为这种情况甚至很少发生
但是,由于Java的应用非常广泛,正在寻找“为什么Java的划分会被打破?”没有任何结果,我可能错了
我的问题是:
- 为什么部门会这样做李>
- 我还能指望在哪里找到这样的魔法/巫毒/意外行为李>
# 1 楼答案
因为语言规范就是这样定义的
因为你基本上把“魔法/巫毒”称为语言规范中完美定义的东西,所以答案是“无处不在”
所以问题是为什么Java中会有这样的设计决策。在我看来,
int
划分导致int
对于强类型语言来说是一个完美的设计决策。纯int
算法经常被使用,因此int
除法会导致float
或double
,您需要进行大量的舍入,这将是不好的# 2 楼答案
如果你用C++来测试,你会看到结果是一样的。 原因是,在将值分配给变量之前,您应该计算它。您键入的数字(1和2)是整数,因此它们的内存分配应该是整数。然后,应根据整数进行除法。之后,它将把它转换为double,这将给出
0.0
# 3 楼答案
你的思维方式就像一个PHP开发人员;PHP是dynamically typed语言。这意味着类型是在运行时推导出来的,因此分数在逻辑上不能产生整数,因此除法运算会隐含一个
double
(或float
)java、c、C++、c等许多语言都是strongly typed语言,所以当一个整数除以整数时,得到一个整数,^ {< CD3>}给我返回^ {CD5>},就像^ {CD5>}给我^ {CD5>},因为^ {CD5>}实际上是^ {CD8>},截断十进制以获得整数(整数除法),并且得到^ {CD4>}。
在强类型语言中,如果希望结果符合预期,则需要显式(或隐式),这就是为什么除法运算中的一个参数是double或float将导致浮点除法(返回分数)
因此,在Java中,您可以执行以下操作之一来获得分数:
从一种松散类型的动态语言到一种强类型的静态语言可能会产生不和谐,但没有必要害怕。只需了解,除了输入之外,您还必须额外注意验证,您还必须验证类型
从PHP到Java,您应该知道您不能这样做:
在PHP中,这将产生输出
1.5
(因为(1/2)*3 == 1.5
),但在Java中这将导致一个错误,因为您不能分割字符串(它不是数字)
希望这能有所帮助
# 4 楼答案
我不是这方面的专业人士,但我认为这是因为运算符是如何定义的,以执行整数运算的。Java使用整数除法来计算结果,因为它看到两者都是整数。它接受两个整数作为这个“除法”方法的输入,除法操作符重载,并执行这个整数除法。如果不是这样的话,那么Java每次都必须在重载方法中执行一个双精度的强制转换,如果您可以在任何情况下都先执行强制转换,这实际上是无用的
# 5 楼答案
# 6 楼答案
Java是一种强类型语言,所以您应该知道表达式中值的类型。如果不是
1
是一个int
(如2
),因此1/2
是1和2的整数除法,因此结果是0
作为int
。然后将结果转换为相应的双精度值,因此0.0
整数除法不同于浮点除法,就像在数学中一样(自然数除法不同于实数除法)