var1=anyInteger
var2=anyInteger
(Math.round(var1/var2)*var2)
什么是上述JavaScript的bitshift替代语法?Javascript bitshift替代math.round
使用整数浮动
谢谢
var1=anyInteger
var2=anyInteger
(Math.round(var1/var2)*var2)
什么是上述JavaScript的bitshift替代语法?Javascript bitshift替代math.round
使用整数浮动
谢谢
[增订] 简单的回答:
这比在问题中提供的方法Math.round()
更快,提供了完全相同的值。
移位比我的测试快10到20%。以下是一些比较两种方法的更新代码。
下面的代码有四个部分:第一,它创建两组随机整数10,000组;其次,它在OP的问题中进行一轮,存储该值供以后比较并记录执行的总时间;第三,它执行相同的位移,存储该值供以后比较,并记录执行时间;第四,它比较圆形和位移值以找出任何差异。它应该报告没有异常。
请注意,这应该适用于所有正值,非零值。如果代码遇到分母为零,它会引发错误,我敢肯定负值不会正确位移,尽管我没有测试过。
var arr1 = [],
arr2 = [],
arrFloorValues = [],
arrShiftValues = [],
intFloorTime = 0,
intShiftTime = 0,
mathround = Math.round, // @trinithis's excellent suggestion
i;
// Step one: create random values to compare
for (i = 0; i < 100000; i++) {
arr1.push(Math.round(Math.random() * 1000) + 1);
arr2.push(Math.round(Math.random() * 1000) + 1);
}
// Step two: test speed of Math.round()
var intStartTime = new Date().getTime();
for (i = 0; i < arr1.length; i++) {
arrFloorValues.push(mathround(arr1[i]/arr2[i]) * arr2[i]);
}
console.log("Math.floor(): " + (new Date().getTime() - intStartTime));
// Step three: test speed of bit shift
var intStartTime = new Date().getTime();
for (i = 0; i < arr1.length; i++) {
arrShiftValues.push(((((arr1[i]/arr2[i]) + 0.5) << 1) >> 1) * arr2[i]);
}
console.log("Shifting: " + (new Date().getTime() - intStartTime));
// Step four: confirm that Math.round() and bit-shift produce same values
intMaxAsserts = 100;
for (i = 0; i < arr1.length; i++) {
if (arrShiftValues[i] !== arrFloorValues[i]) {
console.log("failed on",arr1[i],arr2[i],arrFloorValues[i],arrShiftValues[i])
if (intMaxAsserts-- < 0) break;
}
}
不幸的是,比特移位操作通常只与整数工作。你的变量是整数还是浮点数?
JavaScript的数字是64位浮点数。 – 2010-07-12 22:53:34
pn和sn只是整数的变量。 (Math.round(2/4)* 4)也可以。谢谢 – cube 2010-07-13 00:32:47
如果VAR2是两(2^k)的功率可能会 写
(var1>>k)<<k
但在一般情况下 没有简单的解决办法。
您可以这样做(var | 0)
- 这会将数字截断为整数,但您始终可以获得底价值。如果你想围绕它,你需要额外的if
声明,但在这种情况下,Math.round
反正会更快。
你应该能够通过添加0.5然后移离小数四舍五入任何数量...
var anyNum = 3.14;
var rounded = (anyNum + 0.5) | 0;
所以原来的表达可以使用本(而不是较慢的Math.round来解决)
((var1/var2 + 0.5)|0) * var2
运行下面的代码段,以测试不同的值...
function updateAnswer() {
var A = document.getElementById('a').value;
var B = document.getElementById('b').value;
var h = "Math.round(A/B) * B = <b>" + (Math.round(A/B) * B) + "</b>";
h += "<br/>";
h += "((A/B + 0.5)|0) * B = <b>" + ((A/B + 0.5) | 0) * B +"</b>";
document.getElementById('ans').innerHTML = h;
}
*{font-family:courier}
A: <input id="a" value="42" />
<br/>
B: <input id="b" value="7" />
<br/><br/>
<button onclick="updateAnswer()">go</button>
<hr/>
<span id="ans"></span>
pn和sn只是整数的变量。(Math.round(2/4)* 4)也可以。 谢谢 – cube 2010-07-12 23:59:30
你确定你的意思是位转移?位移会使您每次换班时的值增加一倍或一半。如果var2始终是2的幂,那么它将起作用,但如果var2是一个奇数,处理它的逻辑将比分开它更多的开销。 – Andir 2010-07-13 02:20:50
读这几次,还是不明白你的问题..请改写你正在尝试做 – 2010-07-13 02:33:07