-
105 如果您不知道,javascript中的所有数字都是浮点数。 根据规范: – 一些 评论 2009年2月28日2:40 -
8 4.3.20数字类型:数字类型是表示数字的一组值。 在ECMAScript中,值集表示双精度64位格式的IEEE 754值,包括特殊的“非数字”(NaN)值、正无穷大和负无穷大。 – 一些 评论 2009年2月28日2:41 -
13 是的,Javascript没有独特的“整数”类型,但需要进行这种转换的情况仍然很常见。 例如,在我的应用程序中,用户输入了一个数字(可能包括美分)。 我不得不截断美分并显示w/逗号。 步骤1是转换为int。 – 麦克赫尔姆 评论 2009年2月28日15:40 -
1 也很有用:所有方法的速度比较 jsperf.com/math-floor-vs-math-round-vs-parseint/33 – c.、。。 评论 2012年7月26日18:10 -
1 @卡尔:如果我接受字段的输入,我可能能够控制我接受的字符,但我可以用Javascript进行各种处理,而不仅仅是接受用户输入。 即使那样,我也可能想要它来做一些事情,比如支持粘贴。 – 麦克赫尔姆 评论 2012年10月30日16:55
18个答案
var intvalue=数学floor(floatvalue); var intvalue=数学.ceil(浮点值); var intvalue=数学.round(浮点值); //ECMAScript 6中添加了“Math.trunc” var intvalue=数学.trunc(浮点值);
示例
//值=x//x=5 5<x<5.5 5.5<=x<6 数学底线(值)//5 5 5 数学细胞(值)//5 6 6 数学四舍五入(数值)//5 5 6 数学trunc(值)//5 5 5 parseInt(值)//5 5 5 ~~值//5 5 5 值|0//5 5 5 值>>0//5 5 5 值>>0//5 5 5 value-值%1//5 5 5
//值=x//x=-5-5>x>=-5.5-5.5>x>-6 数学底线(值)//-5-6-6 数学细胞(值)//-5-5-5 数学四舍五入(值)//-5-5-6 数学trunc(值)//-5-5-5 parseInt(值)//-5-5-5 值|0//-5-5-5-5 ~~值//-5-5-5 值>>0//-5-5-5 值>>>0//4294967291 4294967291 42949672 91 value-值%1//-5-5-5-5
//x=数量。 最大安全整数/10//=900719925474099.1 //值=x x=900719925474099 x=90071 99254704099.4 x=9007 19925474099.5 数学下限(值) 数学细胞(值)//900719925474099 90071992474100 900719925.474100 数学四舍五入(值) 数学trunc(值) parseInt(值)//900719925474099 90071992474099 90071995474099 值|0//858993459 858993459 85899345 ~~值//858993459 858993459 858993459 值>>0//858993459 858993459 85899345% 值>>>0//858993459 858993459 85899345% value-值%1//900719925474099 900719924474099 9000719925447099 90071925474099
//x=数量。 最大安全整数/10*-1//-900719925474099.1 //值=x//x=-900719925474099 x=-907199254704099.5 x=-90019925474099.6 数学下限(值)//-900719925474099-9007199625474100-90071925474100 数学细胞(值)//-900719925474099-9007199625474099-90071925474099 数学四舍五入(值)//-900719925474099-90071925474099-9007199625474100 数学trunc(值)//-900719925474099-9007199254740999-90071925474099 parseInt(值)//-900719925474099-9007199625474099-90071925474099 值|0//-858993459-858993459-858993 459 ~~value//-858993459-858993459-858993 459 值>>0//-858993459-858993459-858993459 值>>>0//3435973837 3435973837 3435978337 value-值%1//-900719925474099-90071996254740999-90071925474099
-
90 如另一个答案中所述,可以使用 var intValue=~~floatValue; 。如果符号对您的口味来说太模糊,只需将其隐藏在函数中: 函数toInt(value){return~~value;} .(如果您愿意的话,这也会将字符串转换为整数。) – 基恩 评论 2013年4月19日19:08 -
6 -
11 关于注释~~将值限制为32位有符号整数,而Math.floor/ceil/round最多可以处理53位(Number.MAX_SAFE_INTEGER 9007199254740991)。 下面的答案中提到了这一点,但对于阅读这些评论的人来说,值得在这里重复一下。 – 约翰 评论 2016年3月28日15:27 -
三 -
1
按位OR运算符
函数float2int(value){ 返回值|0; }
float2int(3.1)==3 float2int(-3.1)==-3 float2int(3.9)==3 float2int(-3.9)==-3
性能比较?
数学基础(val) 值|0 按位 或 ~~val个 按位 不是 解析Int(val)
注释
1234567890 | 0 => 1234567890 12345678901 | 0 => -539222987
-
@法比奥波罗尼:是的,非常简单,似乎按位运算符是最快的。 尤其是OR操作符总是最快的,通常与NOT和Math操作匹配,尽管当您必须支持负数时,Math操作也是最慢的,因为它添加了对数字符号的额外检查。 评论 2013年1月10日13:54 -
12 @thefourtheye:除无符号右移外,所有按位运算都适用于有符号32位整数。 因此,对浮点值使用逐位操作将把它们转换为整数,去掉小数点后的数字。 评论 2013年9月2日12:22 -
4 -
9 -
三
函数截断(value) { if(值<0){ return Math.ceil(value); } return Math.floor(value); }
-
1 这取决于负数的期望行为。 有些用法需要负数才能映射到更负值(-3.5->-4),有些用法则需要映射到更小的整数(-3.5->-3)。 前者通常称为“地板”。 “truncate”一词通常用于描述这两种行为。 在我的情况下,我只打算喂它负数。 但这条评论对那些关心负数行为的人来说是一个有用的警告。 – 麦克赫尔姆 评论 2009年10月16日14:35 -
29 @麦克赫尔姆:那么他们似乎没有正确理解“截断”这个词。 截断的作用正如它的名字所暗示的那样:它截断数字。 它永远(在一般意义上)不等同于地板或天花板。 en.wikipedia.org/wiki/截短 – 萨纳托斯 评论 2012年4月16日7:18 -
6 -
4
-
1 -
11 -
20 请注意,任何一种方法(~~n或n|0)都只适用于最大为2^31-1或2147483647的数字。 2147483648或更高版本将返回错误的结果; 例如,2147483647 |0返回-2147483648,4294967295 |0返回-1,这几乎肯定不是您想要的。 – 埃德·巴亚特斯 评论 2012年10月22日18:36
var intvalue=数学地板(值);
var intvalue=数学.round(值);
-
7 -
var intValue=解析Int(floatValue,10);
-
1 -
2 -
2 -
4 虽然这是一个古老的问题,但这个问题似乎是一个经常被问到的问题,所以我在这里把它作为一个警告。 如果由于值的大小,使用“e”表示法表示该值,那么结果将是一个数字,而不是预期的数字。 例如, parseInt(10000000000000000000,10); 结果是1,而不是100 000 000 000 000 00 000 000。 无论如何,这个问题显然不想” 转换为字符串并进行解析 “,虽然这相对较小…;) – 澳航94重型 评论 2013年11月28日2:04 -
6 @澳航94Heavy这种行为的原因是 parseInt() 需要一个 一串 不是数字作为其第一个参数。 传递此整数时,它将转换为 第2页 然后 解析Int 分析字符串 第2页 ,这导致 1 . – 奥拉夫·迪采 评论 2014年1月9日20:56
//>>或>>> 2.0 >> 0; // 2 2.0 >>> 0; // 2
-
4 -
-
这是因为Javascript只对上面答案中所述的32位(有符号)整数执行逐位操作。 因此,任何似乎什么都不做的位操作(比如移位为0,OR为0,AND为1,double NOT)仍然需要Javascript解释器将值转换为32位int。 – 弗兰克·克鲁姆诺 评论 2018年4月25日11:14
var intvalue=数学地板(浮点值); var整数=数学地板(4.56); 答案=4
var intvalue=数学.ceil(浮点值); 答案是=5
控制台.log(12.3^0);// 12 控制台.log(“12.3”^0);// 12 控制台日志(1.2+1.3 ^0);// 2 控制台.log(1.2+1.3*2^0);// 三 console.log(-1.2^0);//- 1 控制台.log(-1.2+1^0);// 0 console.log(-1.2-1.3^0);//- 2
//Math.trunc()是ES6规范的一部分 console.log(Math.trunc(1.5));// 返回1 console.log(数学.trunc(-1.5));// 返回-1 //数学地板(-1.5)将返回-2,这可能不是您想要的
console.log(Math.round(1.5));// 2 console.log(Math.round(1.49));// 1 console.log(Math.round(-1.6));//- 2 console.log(Math.round(-1.3));//- 1
数学地板() 函数返回小于或等于给定数字的最大整数。 console.log(“数学地板:”,数学地板(3.5)); console.log(“数学地板:”,数学地板(-3.5)); 数学ceil() 函数总是将一个数字向上舍入为下一个最大的整数。 console.log('Math.ceil:',Math.ciel(3.5)); console.log('Math.ceil:',Math.ciel(-3.5)); 数学round() 函数返回舍入为最接近整数的数字的值。 console.log('Math.round:',Math.rround(3.5)); console.log(“Math.round:”,Math.rround(-3.5)); 数学trunc() 函数通过删除任何小数返回数字的整数部分。 console.log('Math.trunc:',Math.ttrunk(3.5)); console.log('Math.trunc:',Math.tunc(-3.5));
//将浮点转换为整数 数学基础(5.95) //5 数学细胞(5.95) //6 数学回合(5.4) //5 数学圆(5.5) //6 数学trunc(5.5) //5 //快速方法 控制台.log(5.95|0) 控制台.log(~~5.95) 控制台.log(5.95>>0) //5
性能
结果
对于所有浏览器,所有解决方案(B和K除外)的速度结果都非常相似 解决方案B和K速度较慢
细节
功能A(浮动){ return Math.trunc(浮点); } 功能B(浮动){ return parseInt(浮点); } 功能C(浮动){ 返回浮点|0; } 功能D(浮动){ 返回~~浮点; } 功能E(浮动){ 返回浮动>>0; } 功能F(浮动){ 返回浮点-浮点%1; } 功能G(浮动){ 返回浮点^0; } 功能H(浮动){ return数学地板(浮点); } 功能I(浮动){ return Math.ceil(浮点); } 功能J(浮动){ return Math.round(浮点); } 功能K(浮点){ 返回float.toFixed(0); } 功能L(浮动){ 返回浮动>>>0; } // --------- //测试 // --------- 【A、B、C、D、E、F、G、H、I、J、K、L】 .forEach(f=>控制台.log(`${f.name}${f(1.5)}${f(-1.5)}$}f(2.499)}$[{f(-2.499)}`))
此代码段仅显示性能测试中使用的函数-它本身不执行测试!
const myValue=56.4534931;
const四舍五入=数学底线(myValue);
56
const roundedUp=数学.ceil(myValue);
57