javascript取整数

JavaScript09

javascript取整数,第1张

javascript取整数的方法如下:

Math.round(num)四舍五入

Math.floor(num)小于等于num的整数

Math.ceil()大于等于num的整数

parseInt(num) 小于等于num的整数,与floor的区别是parseInt参数可以是string类型,如'5abc'返回5。

看了下你的代码,我想你可能是要下边的结果吧,希望对你有用:

<input id="jiage" size="5" /> * 

<input id="number" size="5" /> = 

<input id="sum_money" size="10" readonly="readonly" /> <script type="text/javascript">

void function(){

var g = function(d){return document.getElementById(d)},

ID0=g("jiage"), ID1=g("number"), n=g("sum_money")

//响应前两个文本框的键盘事件,而无需使用setTimeout来一直计算

ID0.onkeyup = ID1.onkeyup = function(){

var str0=ID0.value, str1=ID1.value

if (str0=='' || str1=='')

{//只有两个输入框都有输入时才做计算

return n.value=""

}

if (parseFloat(str0) != str0 || parseFloat(str1) != str1)

{//判断输入的两个值是否为数字 (可以为小数,如只允许整数,此处用parseInt)

return n.value="错误输入"

}

//对计算结果取整数,并输出到第三个文本框中。

n.value=parseInt(str0*str1)

}

}()

</script>

按位操作符(Bitwise operators)会使用内置函数, 7.1.5 ToInt32 ( argument ) ,

先将其操作数转换成32位有符号整数 ,再进行位操作,最后返回一个32位有符号整数。

包括,

12.5.8 Bitwise NOT Operator ( ~ ) ,

12.9.3 The Left Shift Operator ( <<) ,

12.9.4 The Signed Right Shift Operator ( >>) ,

12.12 Binary Bitwise Operators

因此, a | 0 , 0 | a ,都可以将变量 a 中数值转换为32位有符号整数。

某些特殊的值,并不是32位有符号整数的安全范围,它们会被转换为 0 。

在计算机中表示有符号整数,通常使用 补码 (two's-complement)进行编码。

它将字的最高有效位解释为符号位,符号位被置为 1 时,表示值为负,

符号位被置为 0 时,表示值为非负。

因此,字长为4的二进制数 0001 表示整数 1 ,其中 0*2^3+0*2^2+0*2^1+1*2^0=1 ,

而 1111 就表示整数 -1 ,其中 -1*2^3+1*2^2+1*2^1+1*2^0=-1 。

负数的补码,还可以按照“ 逐位取反后,加一 ”的方式来获取相应的整数值。

例如, 1111 逐位取反 0000 ,然后再加一 0001 ,它是 1 的二进制表示,

因此 1111 就是表示 -1 了。

~ 操作符,它首先将操作数转换成32位有符号整数,然后再按位取反。

例如, 1 的32位补码编码为,

按位取反,

它表示什么呢?

先看最高为的符号位,是 1 ,它表示一个负数,

然后“逐位取反后,加一”, 00000000 00000000 00000000 00000002 值为 2 ,

因此, 11111111 11111111 11111111 11111110 表示 -2 。

一般的, 可以证明

对于任意的32位有符号整数 x 来说, ~x === -(x+1) 。

详细证明见文后的附录。

ECMAScript中,数组元素的索引范围是, 0 到 Math.pow(2,32)-2 。

规范 9.4.2 Array Exotic Objects 中指出,

超过数组 length 的索引,会被看做数组的属性值,

因此, indexOf 返回的最大值为 Math.pow(2,32)-2 。

Array.prototype.indexOf ,

会返回给定数组元素在数组中的索引,如果找不到给定元素,就返回 -1 。

因为只有 ~-1 等于 0 ,其他索引值取反都非 0 ,

所以,人们经常使用 !~a.indexOf(element) 来判断元素是否在数组中。

这里有一个值得注意的事情,由于 ~ 会首先将操作数转换成32位有符号整数,

所以, -1 和 Math.pow(2,32)-1 具有相同的编码,

但是,数组的最大索引为 Math.pow(2,32)-2 ,小于上面这个值,

因此,对 indexOf 返回的值进行取反,除了 -1 之外,总是非 0 值,是安全的做法。

下面给出 ~x === -(x+1) 的证明。

(1)先看正整数

对于32位正整数来说,它的二进制编码为,

其中 n 表示 0 或者 1 ,

则, ~x 为,

其中 u 为 n 的取反结果。

以上二进制表示,如果看成32位有符号整数,则由于符号位 1 ,它是一个负数,

其绝对值为,“逐位取反后,加一”,即为, (0nnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn)+1 === x+1 ,

即, -(x+1) 。

因此,对于正数, ~x === -(x+1) 。

(2)再看负整数

对于32位负整数来说,它的二进制编码为,

其中 n 表示 0 或者 1 ,

则, ~x 为,

其中 u 为 n 的取反结果。

设 0uuuuuuu uuuuuuuu uuuuuuuu uuuuuuuu 的值为 t ,

则 1nnnnnnn nnnnnnnn nnnnnnnn nnnnnnnn 的值为, -(t+1) ,(逐位取反后,加一)。

因此, x === -(t+1) , ~x === t ,

即, ~x === t === -(-(t+1) + 1) === -(x+1) 。

证毕。

你不知道的JavaScript(中卷)

ECMAScript Language Specification

深入理解计算机系统