2012-04-14 78 views
51

对于我正在编写的脚本,我需要显示一个已经四舍五入的数字,但不包括小数或任何过去的数字。我已经下定决心把它推到第三位,但我不知道如何去掉小数点以及所有的东西,因为它似乎没有像PHP那样的substr功能。在JavaScript中截取/舍入整数?

有什么建议吗?

+2

四舍五入和截断2个不同的操作。你想要做什么? – 2013-12-30 02:10:29

+0

'.substring()'绝对是javascript中的一个函数。 – 2016-06-09 16:59:10

+2

**方法被调用'.toFixed()'** – neaumusic 2016-12-16 01:23:04

回答

96

如果你有一个字符串,解析它作为一个整数:

var num = '20.536'; 
var result = parseInt(num, 10); // 20 

否则,ECMAScript的6报价为Math.trunc完全一致截断,已经在Firefox提供24+和边缘:

var num = -2147483649.536; 
var result = Math.trunc(num); // -2147483649 

如果你不能依赖那个,并且一直有一个正数,你当然可以使用Math.floor

var num = 20.536; 
var result = Math.floor(num); // 20 

最后,如果您在[− 2147483648,2147483647]中有一个数字,则可以使用任何按位运算符截断为32位。 | 0是常见的,并且>>> 0可以用来获得一个无符号的32位整数:

var num = -20.536; 
var result = num | 0; // -20 
+6

Math.floor()会给出负数的错误结果。考虑mozey的答案以获得更好的选择。 – 2013-10-04 21:10:47

+0

@JonBrooks:谢谢,但我推荐'parseInt'开头。考虑mozey对缓慢复杂替代品的回答。 – Ryan 2013-10-05 01:37:53

+2

mozey的'trunc2'实际上是正确的选择,再加上它使用整数比较而不是字符串解析,这会比'parseInt'快得多,并且总是返回正确的结果。 – BlinkyTop 2014-08-11 06:29:34

2

使用Math.floor()

var f = 20.536; 
var i = Math.floor(f); // 20 

http://jsfiddle.net/J4UVV/1/

+1

如果使用负数表示-20.536,那么您将得到错误的截断结果,因为它会导致-21 http://jsfiddle.net/zL1v5e2k/ – 2014-08-12 14:51:14

8

转换数为字符串,并扔掉一切小数点后。

trunc = function(n) { return Number(String(n).replace(/\..*/, "")) } 

trunc(-1.5) === -1 

trunc(1.5) === 1 

编辑2013年7月10日

正如所指出的MiniTech移动和第二认为字符串方法似乎有点过分。所以比较这里和其他地方列出的各种方法:

function trunc1(n){ return parseInt(n, 10); } 
function trunc2(n){ return n - n % 1; } 
function trunc3(n) { return Math[n > 0 ? "floor" : "ceil"](n); } 
function trunc4(n) { return Number(String(n).replace(/\..*/, "")); } 

function getRandomNumber() { return Math.random() * 10; } 

function test(func, desc) { 
    var t1, t2; 
    var ave = 0; 
    for (var k = 0; k < 10; k++) { 
     t1 = new Date().getTime(); 
     for (var i = 0; i < 1000000; i++) { 
      window[func](getRandomNumber()); 
     } 
     t2 = new Date().getTime(); 
     ave += t2 - t1; 
    } 
    console.info(desc + " => " + (ave/10)); 
} 

test("trunc1", "parseInt"); 
test("trunc2", "mod"); 
test("trunc3", "Math"); 
test("trunc4", "String"); 

的结果,这可基于所述硬件,如下:

parseInt => 258.7 
mod  => 246.2 
Math  => 243.8 
String => 1373.1 

的Math.floor /小区方法是略高于更快parseInt和mod。与其他方法相比,字符串表现不佳。

+0

'parseInt'和字符串替换将返回数字大于999999999999999900000. – Ryan 2014-08-10 14:48:29

+0

我从这次体验中脱身:除非性能是一个巨大的问题,为简单起见,只需使用'parseInt',否则实现'trunc3()' – RozzA 2017-01-06 19:26:18

12

我会在这里添加我的解决方案。我们可以使用地板时,值大于0和小区的时候都小于零:

function truncateToInt(x) 
{ 
    if(x > 0) 
    { 
     return Math.floor(x); 
    } 
    else 
    { 
     return Math.ceil(x); 
    } 
} 

然后:

y = truncateToInt(2.9999); // results in 2 
y = truncateToInt(-3.118); //results in -3 
+2

我不明白为什么这个答案是downvoted。这是唯一正确的方法! – BlinkyTop 2014-08-11 06:24:00

15

特拉维斯Pessetto与mozey的trunc2功能沿着答案是唯一正确的答案,考虑如何JavaScript以科学记数法表示非常小或非常大的浮点数。例如,parseInt(-2.2043642353916286e-15)将不会正确解析该输入。它将返回-2而不是返回0

这是正确的(恕我直言最少的疯狂)的方式来做到这一点:

function truncate(number) 
{ 
    return number > 0 
     ? Math.floor(number) 
     : Math.ceil(number); 
} 
+0

对我来说Math.trunc(-2.2043642353916286e-15)返回零。我已经在https://www.typescriptlang.org/play/中进行了测试 – Devid 2017-09-30 10:09:15