Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';检查一个数字是另一个数字的倍数,这似乎是过度设计代码的原因是什么?_Java_Design Patterns_Division_Integer Division - Fatal编程技术网

Java 什么';检查一个数字是另一个数字的倍数,这似乎是过度设计代码的原因是什么?

Java 什么';检查一个数字是另一个数字的倍数,这似乎是过度设计代码的原因是什么?,java,design-patterns,division,integer-division,Java,Design Patterns,Division,Integer Division,根据,如果我想检查一个数字是否是另一个数字的倍数,我可以使用余数运算符% if( number % anotherNumber == 0 ) { number is a multiple of anotherNumber } 然而,在满是故意设计过度的代码的情况下,他们使用了以下方法: // int number; // int anotherNumber; if ((((int)(number / anotherNumber)) * anotherNumber == number

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

 if( number % anotherNumber == 0 ) {
    number is a multiple of anotherNumber
 }
然而,在满是故意设计过度的代码的情况下,他们使用了以下方法:

// int number;
// int anotherNumber;
if ((((int)(number / anotherNumber)) * anotherNumber == number)) {
    number is a multiple of anotherNumber
}
实际上,它将
数字
除以
另一个数字
,然后将其相乘,并检查结果是否为
数字


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

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

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

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

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


我说不出作者为什么要这样写,但他们觉得有必要将整数除法的结果转换为
int
,这一事实可能会给我们一个提示……

不,这显然是程序员资质较低的情况。模一在任何初级计算机科学课程中都会遇到。过度设计可能是由于缺乏类似的背景/实践

另外,我不会低估相关人员。

例如

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
如果除法
number/anotherNumber
的结果为整数,则可以看到结果仅与
number
相同

所以

if( number % anotherNumber == 0 ) 

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


我很确定编写代码的程序员不是不知道
%
-运算符,就是在这种情况下没有考虑它。

+1,“永远不要把可以用愚蠢来解释的恶意归因于恶意。”(请注意,像这样明显模糊的条件确实可以正确处理整数溢出条件,而明显的版本则不能。不要简化这类代码。至少在您使用带有合理整数的语言之前不要这样做。)您链接到的项目是一个仿制品(你在你的帖子中也强调了这一点)。我很确定答案是它是故意设计过度的,因为这正是编码人员的目的。假设它没有实际意义可能是安全的:)如果
number
是一个
long
float
double
会有所不同,但不清楚类型是什么。如果你想要一个真实的答案,而不仅仅是为了发布堆栈溢出问题而问:问作者。@AlexG:如果我只想知道这是否是一个记录,为什么我要问作者个性化设计模式?
if ((((int)(number / anotherNumber)) * anotherNumber == number))