JavaScript中如何确定一个数字是否为奇数

329

有人能为我提供一些JavaScript代码,用于确定一个数字是偶数还是奇数吗?


8
жҲ‘еҸҜд»ҘдёәжӮЁзҝ»иҜ‘иҝҷзҜҮж–Үз« пјҢ并е°ҪеҸҜиғҪдҝқжҢҒеҺҹж–Үж„ҸжҖқпјҢдҪҝе…¶жӣҙеҠ йҖҡдҝ—жҳ“жҮӮгҖӮд»ҘдёӢжҳҜзҝ»иҜ‘зҡ„еҶ…е®№пјҡJavaScript/еҸӮиҖғ/иҝҗз®—з¬Ұ/з®—жңҜиҝҗз®—з¬Ұз®—жңҜиҝҗз®—з¬ҰеҜ№ж•°еҖјиҝӣиЎҢз®—жңҜж“ҚдҪңпјҢ并иҝ”еӣһдёҖдёӘж–°зҡ„ж•°еҖјгҖӮеҠ еҸ·пјҲ+пјүпјҡе°ҶдёӨдёӘж•°еҖјзӣёеҠ пјҢжҲ–е°Ҷеӯ—з¬ҰдёІиҝһжҺҘиө·жқҘгҖӮ еҮҸеҸ·пјҲ-пјүпјҡе°ҶдёӨдёӘж•°еҖјзӣёеҮҸгҖӮ д№ҳеҸ·пјҲ*пјүпјҡе°ҶдёӨдёӘж•°еҖјзӣёд№ҳгҖӮ йҷӨеҸ·пјҲ/пјүпјҡе°ҶдёӨдёӘж•°еҖјзӣёйҷӨгҖӮ еҸ–жЁЎпјҲ%пјүпјҡиҝ”еӣһдёӨдёӘж•°еҖјзӣёйҷӨжүҖеҫ—зҡ„дҪҷж•°гҖӮзӨәдҫӢпјҡconsole.log(5 + 10); // иҫ“еҮә15 console.log(5.5 % 2); // иҫ“еҮә1.5 var x = "Hello "; var y = "world!"; console.log(x + y); // иҫ“еҮә"Hello world!"иҜ·жіЁж„ҸпјҢеҰӮжһңжӮЁе°қиҜ•е°Ҷйқһж•°еӯ—зҡ„ж“ҚдҪңж•°еә”з”ЁдәҺз®—жңҜиҝҗз®—з¬ҰпјҢеҲҷJavaScriptе°Ҷе°қиҜ•е°Ҷе®ғ们иҪ¬жҚўдёәж•°еӯ—гҖӮеҰӮжһңиҪ¬жҚўеӨұиҙҘпјҢеҲҷз»“жһңе°ҶдёәNaNпјҲдёҚжҳҜж•°еӯ—пјүгҖӮ - epascarello
1
@DavidThomas 我有一些不同意见,但也有两个要点需要注意:1. 如果我必须选择,我宁愿初学者程序员了解“%”运算符而不是“&”;2. 虽然理论上,“&”更快,但实际上并不重要(http://jsperf.com/bitwise-and-vs-mod-for-determining-even-or-odd/2)。 - kojiro
3
@kojiro说:“我更希望给学习者提供更多(有效的)选项;并且我以前从来没有想过以这种方式使用位与运算,所以这是一种有趣的想法。无论如何,既然它是一个重复问题,我已经标记要与现有问题合并。希望这样,这里的答案(至少是那个特定的答案)不会消失。” - David Thomas
1
@kojiro,很抱歉告诉你,你的小提琴是相当无用的,因为大部分计算时间都被函数调用占据了。但是没有人会使用函数调用来确定一个数字是奇数还是偶数...我对你的测试进行了第三次修订,但现在我正在使用手机... - MaxArt
1
可能是测试一个值是奇数还是偶数的重复问题。 - bummi
显示剩余3条评论
32个回答

467

使用以下代码:

function isOdd(num) { return num % 2;}
console.log("1 is " + isOdd(1));
console.log("2 is " + isOdd(2));
console.log("3 is " + isOdd(3));
console.log("4 is " + isOdd(4));

1代表奇数,0代表偶数。


120
注意,这将返回 01(如果您输入的不是数字且无法强制转换为数字,则返回 NaN),对于大多数情况都可以正常工作。但是,如果您想要一个真正的 truefalse,请使用以下代码:return (num % 2) == 1; - T.J. Crowder
5
关于NaN的注释说得好。但通常情况下,你希望JavaScript是真或假的,这就是我写代码时的原因。 - Chii
10
为了澄清,取模运算符(%)给出除法余数。因此,3%2表示3除以2,余数为1,所以3%2将返回1。 - Abuh
6
根据T.J.的说法,如果num不是整数,这将返回一个分数。如果你比较isOdd(1.5)==true,仍然会起作用(因为一个分数值不等于true),但是如果该函数按照名称“isOdd”所暗示的返回truefalse会更好。 - nnnnnn
10
你还可以使用 return !!(num % 2) 来获取一个布尔值。 - Duncan
显示剩余6条评论

146
使用按位 AND 运算符。

function oddOrEven(x) {
  return ( x & 1 ) ? "odd" : "even";
}

function checkNumber(argNumber) {
  document.getElementById("result").innerHTML = "Number " + argNumber + " is " + oddOrEven(argNumber);
}
 
checkNumber(17);
<div id="result" style="font-size:150%;text-shadow: 1px 1px 2px #CE5937;" ></div>

如果你不想要一个字符串返回值,而是布尔值,请使用以下代码:
var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };

7
+1,你的答案绝对比我的好,更不用说你的答案是唯一一个没有使用 X % Y 的了! - s0d4pop
6
我不确定我的测试是否准确,但按位与运算符似乎比模数运算符慢40倍,对于固定数字而言,随机数字则慢2倍:http://jsperf.com/odd-or-even - Blender
9
请注意,这将针对不是奇数或偶数的数字(例如3.14)返回“odd”或“even”。 - nnnnnn
2
或者: function isEven(n){return !(n & 1);} - RobG
8
每个数字都由一系列位(bit)组成。所有奇数的最低有效位(最右边的位)都为1,所有偶数都为0。x & 1检查数字中是否设置了最后一位(因为1是一个除了最低有效位之外所有位都设置为1的数字):如果设置了,则该数字为奇数,否则为偶数。 - David G
显示剩余10条评论

34
您可以像这样做:
function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}

9
似乎你不知道什么是布尔值。if (condition) { answer=true; } else { answer=false; }只是answer = (bool) condition;的一个冗长版本。将你的函数简化为function isEven(value) { return (bool) (value%2 == 0); },这样我们都会很高兴。 - awm
30
没必要变得刻薄,只因为我以不同的方式编程。 - TNC
8
似乎你不了解JavaScript。你不能使用(bool)将其转换为布尔值(这会导致错误),而且无论如何也不需要这样做:return value%2 == 0;就可以完成任务,因为==运算符返回一个布尔值。 - nnnnnn
2
哇,我真的写了那个吗?是的,显然是错的;应该像这样 answer = !!(condition)。当然,我试图表达的重点是你可以只需 return value%2==0 而不需要费心处理条件。 - awm
1
如果 (条件) 返回 true; 否则返回 false; 不是“风格差异”,而是独立的坏代码,因为它只是多余的样板文件,没有任何好处。刚开始学编程的人应该明白,你可以返回表达式和变量,而不仅仅是原始值,在JS中,value%2==0实际上是一个布尔表达式。 - éclairevoyant
显示剩余2条评论

21
function isEven(x) { return (x%2)==0; }
function isOdd(x) { return !isEven(x); }

21

我必须把一个包含很多偶数的数组变得非常大吗?

不需要。使用模运算符(%),它会给出你正在除以的两个数字之间的余数。

Ex. 2 % 2 = 0 because 2/2 = 1 with 0 remainder.

Ex2. 3 % 2 = 1 because 3/2 = 1 with 1 remainder.

Ex3. -7 % 2 = -1 because -7/2 = -3 with -1 remainder.

这意味着如果你用2去除任何一个数字x,你会得到0或1或-1。0代表x是偶数。其他任何结果都代表x是奇数。


14

这可以通过一小段代码来解决:

function isEven(value) {
    return !(value % 2)
}
希望这能帮助你 :)

13

在 ES6 中:

const isOdd = num => num % 2 == 1;

4
在回答已有26个答案的8年老问题时,解释你的答案针对问题的哪个新方面,并说明时间的推移和新版本对答案的影响会非常有用。仅提供代码的答案通常可以通过添加一些解释来改进,在这种情况下,还可以展示一些使用示例调用。 - Jason Aller
4
如何在JavaScript中确定一个数字是否为奇数,而没有提供ES6解决方案。 - Darryl Mendonez

12

和许多其他编程语言一样,JavaScript 有一个 取模运算符 %,用于求两个数相除的余数。如果一个数被2整除后没有余数,那么这个数就是偶数:

// this expression is true if "number" is even, false otherwise
(number % 2 == 0)

同样地,如果一个数除以2有余数1,则这个数是奇数:

// this expression is true if "number" is odd, false otherwise
(number % 2 == 1)

这是一种用于测试偶数的常见语法。


3
然而,对于负值来说,模数可能会棘手/未定义...请务必参考适当的语言规范。 - user166390

8

通过位运算,可以进行代码高尔夫:

var isEven=n=>(n&1)?"odd":"even";

& 位运算符仅适用于不超过2^32的数字。% 适用于不超过2^53的数字。 - Rewind
是的,@Rewind 它只对一些 Code Golfing 挑战有用,而不适用于编写生产代码。 - Katia Punter
如果输入不是整数,那么也是不正确的。 - éclairevoyant
@éclairevoyant 我理解这个问题的意思是“展示所有实现奇数或偶数的不同方法”,我给出了一个清晰标注为codegolfing的答案。这意味着 - 专注于尽可能少地使用字符来实现该功能。 - Katia Punter
@KatiaPunter 这是一种在其他一些编程语言中有效的方法,但不适用于JS。 - éclairevoyant

6

一个简单的函数,您可以随处传递。使用取模运算符%

var is_even = function(x) {
    return !(x % 2); 
}

is_even(3)
false
is_even(6)
true

1
如果你在三元运算符中的结果只有“true”或“false”,那么你真的不需要使用三元运算符。在这里,你可以/应该只需执行:return !(x % 2); - dom_watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接