在 JavaScript 中截断/舍入整数



对于我正在编写的脚本,我需要显示一个四舍五入的数字,但不能显示小数或超过它的任何内容。我已经把它四舍五入到第三位,但我不确定如何去掉小数和过去的所有内容,因为 JavaScript 似乎不像 PHP 那样具有substr函数。

有什么建议吗?

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

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

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

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

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

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

我将在此处添加我的解决方案。 我们可以在值大于 0 时使用 floor,在小于零时使用 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)

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

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稍微快一点。与其他方法相比,字符串的性能确实很差。

使用 Math.floor()

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

http://jsfiddle.net/J4UVV/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

最新更新