在JavaScript中截断/舍入整数?


67

对于我正在编写的脚本,我需要显示一个已经四舍五入的数字,而不是十进制或其他任何数字。我已经将其四舍五入到第三位,但是我不确定如何去掉小数点后的所有内容,因为JavaScript似乎没有substr像PHP那样的功能。

有什么建议吗?


2
舍入和截断是2个不同的操作。您要尝试哪一个?
Mark E. Haase 2013年

.substring()绝对是javascript中的函数。
汤姆·伯里斯

4
该方法被.toFixed()
称为

4
不要使用toFixed。它会圆。例如(999/1000).toFixed(0)->'1'。正如@ryan所说的,使用Math.trunc
恐慌症

Answers:


132

如果您有一个字符串,则将其解析为整数:

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

如果您有数字,ECMAScript 6提供Math.trunc了完全一致的截断功能,Firefox 24+和Edge中已经提供了这些功能:

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

8
Math.floor()对于负数将给出错误的结果。考虑下面的mozey答案,以获得更好的选择。
乔恩·布鲁克斯

@JonBrooks:谢谢,但是我建议parseInt先开始。考虑一下mozey对于缓慢而复杂的替代方案的回答。
Ry-

2
mozey'strunc2实际上是正确的选项,加上它使用整数比较而不是字符串解析,这会使它比快得多parseInt,并且总是返回正确的结果。
BlinkyTop

1
您确定Math.trunc要在IE 11中受支持吗?MDN表示不支持IE。我也在IE 11中进行了尝试,并得到“对象不支持属性或方法'trunc'”。
坦率的谭谭

1
@FrankTan:啊,对不起,我的意思是Edge。幸运的是,很容易创建匀场。
Ry-

16

trunc2考虑到JavaScript如何以科学计数法表示很小或很大的浮点数,Travis Pessetto的答案以及mozey函数是唯一正确的答案。

例如,parseInt(-2.2043642353916286e-15)将无法正确解析该输入。而不是返回0它将返回-2

这是正确的方法(并且恕我直言,这是最疯狂的):

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

对我来说Math.trunc(-2.2043642353916286e-15)返回零。我在测试它typescriptlang.org/play
DEVID

15

我将在这里添加我的解决方案。当值大于0时,我们可以使用下限;而当值小于零时,我们可以使用ceil:

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

注意:此答案是在Math.trunc(x)相当新的时候编写的,许多浏览器都不支持。如今,现代浏览器支持Math.trunc(x)


2
我不明白为什么这个答案被否决了。这是唯一正确的方法!
BlinkyTop

@BlinkyTop因为Math.trunc(x)就是那样
maganap '20

回答此问题时,@ magnapMath.trunc(x)相当新,并且当时不受所有现代浏览器的支持。例如,它当时不适用于Microsoft Edge(2015年发布的Edge 12及更高版本支持它),而IE甚至今天都不支持Math.trunc(x)
Travis Pessetto

10

将数字转换为字符串,并丢弃小数点后的所有内容。

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

trunc(-1.5) === -1

trunc(1.5) === 1

编辑2013-07-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 / ceil方法比parseInt和mod快一点。与其他方法相比,String的性能确实很差。


parseInt和字符串替换将返回不正确的答案比999999999999999900000.更大的数字
Ry-

我从这种经验中获得的经验:除非性能是一个大问题parseInt,否则请仅出于简化目的而使用,否则请实施trunc3()
RozzA


1

Math.trunc()函数删除所有小数位。

对于正数,其行为与Math.floor()完全相同:

console.log(Math.trunc(89.13349)); // output is 89

对于负数,其行为与Math.ceil()相同:

console.log(Math.trunc(-89.13349)); //output is -89
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.