Yar*_*rin 854 javascript math modulo integer-division
在JavaScript中,我如何获得:
Mar*_*iot 1137
对于某些数字y和一些除数,x将quotient(quotient)和remainder(remainder)计算为:
var quotient = Math.floor(y/x);
var remainder = y % x;
Run Code Online (Sandbox Code Playgroud)
use*_*716 350
我不是按位运算符的专家,但这是获得整数的另一种方法:
var num = ~~(a / b);
Run Code Online (Sandbox Code Playgroud)
这也适用于负数,而Math.floor()在错误的方向上.
这似乎也是正确的:
var num = (a / b) >> 0;
Run Code Online (Sandbox Code Playgroud)
Kal*_*lEl 192
我在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
Run Code Online (Sandbox Code Playgroud)
以上是基于每个1000万次试验.
结论:使用(a/b>>0)(或(~~(a/b))或(a/b|0))可以使效率提高约20%.也请记住,他们都是不一致Math.floor的时候a/b<0 && a%b!=0.
Ori*_*iol 125
ES6引入了新Math.trunc方法.这允许修复@MarkElliot的答案,使其也适用于负数:
var div = Math.trunc(y/x);
var rem = y % x;
Run Code Online (Sandbox Code Playgroud)
请注意,Math与按位运算符相比,这些方法具有优势,它们可以使用超过2 31的数字.
小智 26
var remainder = x % y;
return (x - remainder) / y;
Run Code Online (Sandbox Code Playgroud)
Édi*_*ças 14
您可以使用该函数parseInt来获取截断的结果.
parseInt(a/b)
Run Code Online (Sandbox Code Playgroud)
要获得余数,请使用mod运算符:
a%b
Run Code Online (Sandbox Code Playgroud)
parseInt有一些字符串的缺陷,以避免使用基数为10的radix参数
parseInt("09", 10)
Run Code Online (Sandbox Code Playgroud)
在某些情况下,数字的字符串表示形式可以是科学记数法,在这种情况下,parseInt将产生错误的结果.
parseInt(100000000000000000000000000000000, 10) // 1e+32
Run Code Online (Sandbox Code Playgroud)
此调用将生成1作为结果.
小智 9
我通常使用:
const quotient = (a - a % b) / b;
const remainder = a % b;
Run Code Online (Sandbox Code Playgroud)
它可能不是最优雅的,但是可以工作。
JavaScript根据数学定义计算负数的底限和非整数的其余部分.
FLOOR定义为"小于参数的最大整数",因此:
REMAINDER被定义为除法的"遗留"(欧几里德算术).当被除数不是整数时,商通常也不是整数,即没有余数,但如果商被强制为整数(当有人试图获得余数或模数时会发生这种情况)浮点数),显然会有一个非整数"遗留".
JavaScript确实按预期计算了所有内容,因此程序员必须小心提出正确的问题(人们应该小心回答问题!)Yarin的第一个问题不是"X乘Y的整数除法是什么",但是,相反,"给定整数进入另一个整数的次数".对于正数,两者的答案是相同的,但不是负数,因为整数除法(除数除数)将比数字(除数)"进入"另一个(被除数)的次数小-1.换句话说,FLOOR将返回负数的整数除法的正确答案,但Yarin没有问这个!
gammax回答正确,该代码按Yarin的要求工作.另一方面,塞缪尔错了,我猜他没有做数学,或者他会看到它确实有效(同样,他没有说他的例子的除数是什么,但我希望它是3):
剩余= X%Y = -100%3 = -1
GoesInto =(X - 剩余)/ Y =( - 100 - -1)/ 3 = -99/3 = -33
顺便说一句,我测试了Firefox 27.0.1上的代码,它按预期工作,有正数和负数,也有非整数值,分别用于红利和除数.例:
-100.34/3.57:GoesInto = -28,Remainder = -0.3800000000000079
是的,我注意到,那里存在精确问题,但我没有时间检查它(我不知道它是Firefox,Windows 7还是我的CPU的FPU的问题).但是,对于Yarin的问题,只涉及整数,gammax的代码完美无缺.
Math.floor(operation) 返回操作的向下舍入值.
第一个问题的例子:
var x = 5;
var y = 10.4;
var z = Math.floor(x + y);
console.log(z);
Run Code Online (Sandbox Code Playgroud)
安慰:
15
第二个问题的例子:
var x = 14;
var y = 5;
var z = Math.floor(x%y);
console.log(x);
Run Code Online (Sandbox Code Playgroud)
安慰:
4
使用:
const idivmod = (a, b) => [a/b |0, a%b];
Run Code Online (Sandbox Code Playgroud)
还有一个正在研究的提案: Modulus and Extra Integer Math
| 归档时间: |
|
| 查看次数: |
650811 次 |
| 最近记录: |