在JavaScript中截断/舍入整数?

Eri*_*ric 63 javascript decimal rounding

对于我正在编写的脚本,我需要显示一个已经舍入的数字,但不是十进制或过去的任何内容.我已经把它四舍五入到了第三位,但是我不知道如何去掉小数和一切都过去,因为它似乎没有substr像PHP这样的函数.

有什么建议?

Ry-*_*Ry- 125

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

var num = '20.536';
var result = parseInt(num, 10);  // 20
Run Code Online (Sandbox Code Playgroud)

如果您有一个数字,ECMAScript 6提供Math.trunc完全一致的截断,已在Firefox 24+和Edge中提供:

var num = -2147483649.536;
var result = Math.trunc(num);  // -2147483649
Run Code Online (Sandbox Code Playgroud)

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

var num = 20.536;
var result = Math.floor(num);  // 20
Run Code Online (Sandbox Code Playgroud)

最后,如果在[-2147483648,2147483647]中有一个数字,则可以使用任何按位运算符截断为32位.| 0很常见,>>> 0可用于获取无符号的32位整数:

var num = -20.536;
var result = num | 0;  // -20
Run Code Online (Sandbox Code Playgroud)

  • Math.floor()会给出负数的错误结果.考虑下面mozey的答案,以获得更好的选择. (8认同)
  • mozey的`trunc2`实际上是正确的选项,加上它使用整数比较而不是字符串解析,这将使它比`parseInt`快得多,并且总是返回正确的结果. (2认同)

Bli*_*Top 16

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

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

这是正确的(并且最不精确)的方法:

function truncate(number)
{
    return number > 0
         ? Math.floor(number)
         : Math.ceil(number);
}
Run Code Online (Sandbox Code Playgroud)


Tra*_*tto 14

我会在这里添加我的解决方案.我们可以在值大于0时使用floor,在小于零时使用ceil:

function truncateToInt(x)
{
    if(x > 0)
    {
         return Math.floor(x);
    }
    else
    {
         return Math.ceil(x);
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后:

y = truncateToInt(2.9999); // results in 2
y = truncateToInt(-3.118); //results in -3
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这个答案被低估了.这是唯一正确的方法! (2认同)

moz*_*zey 9

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

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

trunc(-1.5) === -1

trunc(1.5) === 1
Run Code Online (Sandbox Code Playgroud)

编辑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");
Run Code Online (Sandbox Code Playgroud)

结果可能因硬件而异,如下所示:

parseInt => 258.7
mod      => 246.2
Math     => 243.8
String   => 1373.1
Run Code Online (Sandbox Code Playgroud)

Math.floor/ceil方法比parseInt和mod略快.与其他方法相比,String表现不佳.