这个看似过度设计的代码检查一个数字的原因是另一个数字的倍数是什么原因?

时间:2013-04-12 07:44:22

标签: java design-patterns division integer-division

根据this answer,如果我想检查一个数字是另一个数字的倍数,我可以使用余数运算符%

 if( number % anotherNumber == 0 ) {
    number is a multiple of anotherNumber
 }

然而在this fun project充满故意过度编码的代码中,他们使用以下方法:

// int number;
// int anotherNumber;
if ((((int)(number / anotherNumber)) * anotherNumber == number)) {
    number is a multiple of anotherNumber
}

实际上将number除以anotherNumber,然后将其相乘并检查结果是否为number

第二种方法是否有任何实际意义,或者只是故意过度设计?

4 个答案:

答案 0 :(得分:2)

看起来第二个代码的作者不知道%运算符并使用乘法来验证是否存在余数部分:)

答案 1 :(得分:1)

它直接来自于余数运算符(JLS §15.17.3)的定义,两者在语义上是等价的:

  

二进制数字提升(第5.6.2节)后整数操作数的余数运算产生的结果值使(a/b)*b+(a%b)等于a

因此,更复杂的方法没有优势。

我不能说为什么作者以他们的方式编写它,但他们认为有必要将整数除法的结果转换为int这一事实可能会给出一个提示...

答案 2 :(得分:0)

不,这显然是程序员资格较少的情况。 Modulo在基础级别的任何计算机科学课程中遇到过。过度工程可能伴随着类似的缺乏背景/实践。

P.S。我不会低估那个有关的人。

答案 3 :(得分:0)

实施例

number = 13
anotherNumber = 4
number / anotherNumber = 13 / 4 = 3.25  // if  number or anotherNumber has type float or double
(int)(number / anotherNumber) = 3
(((int)(number / anotherNumber)) * anotherNumber = 3 * 4 = 12

如果devision number有一个整数结果,你可以看到结果只与number / anotherNumber相同。

因此

if( number % anotherNumber == 0 ) 

if ((((int)(number / anotherNumber)) * anotherNumber == number))

在同样的情况下也是如此。 我很确定,第一个版本有更好的性能。

我非常确定编写代码的程序员要么不知道% - 运算符,要么在这种情况下没有考虑过。