在JavaScript中,我如何获得以下内容:
1. 一个给定整数被另一个整数整除的次数? 2. 余数?
1. 一个给定整数被另一个整数整除的次数? 2. 余数?
计算除数x
对被除数y
的商(quotient
)[1]和余数(remainder
),公式如下:
const quotient = Math.floor(y/x);
const remainder = y % x;
示例:
const quotient = Math.floor(13/3); // => 4 => the times 3 fits into 13
const remainder = 13 % 3; // => 1
[1] 一个数字除以另一个数字所得到的整数
我不是位运算符的专家,但这是另一种获取整数的方法:
var num = ~~(a / b);
这个方法同样适用于负数,而 Math.floor()
会向错误的方向舍入。
这个看起来也是正确的:
var num = (a / b) >> 0;
~~
}}作为{{link2:Math.trunc()
}}的替代。a/b | 0
。 - BlueRaja - Danny Pflughoeft~~ int
,int | 0
和int >> 0
不会修改初始参数,而是将整数部分传递给运算符。 - Aleksei Zabrodskiia = 12447132275286670000; b = 128
。Math.floor(a/b)
的结果是97243220900677100
,而~~(a/b)
的结果则为-1231452688
。 - Mirek Rusin~~(5/2)-->2
,(5/2)>>0-->2
,但是~~(5/2)+1-->3
,而~~(5/2)>>0+1-->1
。~~
是一个不错的选择,因为它的优先级更加适当。 - timkay我在Firefox上进行了一些速度测试。
-100/3 // -33.33..., 0.3663 millisec
Math.floor(-100/3) // -34, 0.5016 millisec
~~(-100/3) // -33, 0.3619 millisec
(-100/3>>0) // -33, 0.3632 millisec
(-100/3|0) // -33, 0.3856 millisec
(-100-(-100%3))/3 // -33, 0.3591 millisec
/* a=-100, b=3 */
a/b // -33.33..., 0.4863 millisec
Math.floor(a/b) // -34, 0.6019 millisec
~~(a/b) // -33, 0.5148 millisec
(a/b>>0) // -33, 0.5048 millisec
(a/b|0) // -33, 0.5078 millisec
(a-(a%b))/b // -33, 0.6649 millisec
以上内容基于每个实验10百万次。
结论: 使用 (a/b>>0)
(或者 (~~(a/b))
或者 (a/b|0)
) 可以使效率提高约20%。还要记住,当 a/b<0 && a%b!=0
时,它们都与 Math.floor
不一致。
Math.floor
和其他许多 API 函数,还是学习 JS 中的位取反运算符 ~
,以及位运算如何工作,然后理解双位取反的效果? - Stijn de WittMath.floor
函数。即使不是这样,这个函数也可以通过谷歌搜索得到答案。 - mik01ajES6引入了新的Math.trunc
方法。这允许修复@MarkElliot答案,使其也适用于负数:
var div = Math.trunc(y/x);
var rem = y % x;
请注意,Math
方法优于位运算符的优点在于它们适用于超过231的数字。
18014398509481984 == 18014398509481985
。 - Oriol~~(x/y)
。需要支持更大的数字,最高可达54位有符号数字?如果你有Math.trunc
,则使用它,否则使用Math.floor
(对负数正确)。需要支持更大的数字吗?使用一些大数字库。 - Stijn de Wittdivmod
的 Ruby 程序员,你可以这样实现它: var div = Math.trunc(x/y);
var rem = x % y;
return [div, rem];
}
该函数返回两个数的数组,第一个数是除法结果,第二个数是余数。 - Alex Moore-Niemi我通常使用:
const quotient = (a - a % b) / b;
const remainder = a % b;
可能不是最优雅的方式,但它有效。
var remainder = x % y;
return (x - remainder) / y;
Math.trunc
方法相同的值:)。我已经检查了100,3; -100,3; 100,-3和-100,-3。当然,自从您的评论以来已经过了很长时间,事情也发生了变化。 - Marjan Venema你可以使用parseInt
函数来获得截断的结果。
parseInt(a/b)
要获取余数,请使用模运算符:
a%b
parseInt在处理字符串时有一些限制,为了避免这些问题,请使用基数参数并设置为10
parseInt("09", 10)
在某些情况下,数字的字符串表示可能是科学计数法,此时使用parseInt将产生错误的结果。parseInt(100000000000000000000000000000000, 10) // 1e+32
这个调用将会产生1作为结果。
parseInt
。Douglas Crockford发出了这样的警告:“如果字符串的第一个字符是0,则将在八进制而不是十进制中评估该字符串。在八进制中,8和9不是数字,因此parseInt(“08”)和parseInt(“09”)的结果为0。此错误会导致解析日期和时间的程序出现问题。幸运的是,parseInt
可以接受一个基数参数,这样parseInt(“08”,10)
就会产生8。我建议您始终提供基数参数。” http://archive.oreilly.com/pub/a/javascript/excerpts/javascript-good-parts/awful-parts.html - PowersparseInt
,只是要注意其中的一些陷阱。你必须意识到这些问题并准备应对。 - NoneparseInt
函数。parseInt
函数用于解析部分包含数字的字符串,而不是截断数字。 - OriolMath.floor(operation)
返回操作的向下舍入值。
第一个问题的示例:
const x = 5;
const y = 10.4;
const z = Math.floor(x + y);
console.log(z);
第二个问题的示例:
const x = 14;
const y = 5;
const z = Math.floor(x % y);
console.log(x);
%
运算符可用于浮点数(这与许多其他编程语言不同),可能并不是所期望的:3.5 % 2
的计算结果为1.5。请确保根据需要使用parseInt
、floor
等方法进行处理。 - user166390floor
和%
结合在这方面不是一致的。要么使用trunc
代替floor
(从而允许出现负余数),要么使用减法来获取余数(rem = y - div * x
)。 - Mark Reedrem
,那么你可以更快地得到商div
,而不必向下取整:(y - rem) / x
。function mod (a, n) { return a % n + (Math.sign(a) !== Math.sign(n) ? n : 0); }
。