如何从JavaScript数字中删除小数部分?


218

我有除法运算的结果,但我希望舍弃所得数字的小数部分。

我怎样才能做到这一点?

Answers:


384

你可以用...

...取决于您要删除小数的方式。

Math.trunc()目前尚不支持所有平台(即IE),但与此同时,您可以轻松使用polyfill

在出色的平台支持下截断小数部分的另一种方法是使用按位运算符(.eg |0)。在数字上使用按位运算符的副作用是它将其操作数视为有符号的32位整数,因此删除了小数部分。请记住,这还会破坏大于32位的数字。


您可能还在谈论浮点算术十进制舍入的不准确性。

必读-每位计算机科学家都应了解的浮点运算法则


29
请记住,当数字为负数Math.floor()增加数值。因此而。(如@FloydPink所述)将按预期丢弃正数负数的小数部分。Math.floor(-1.2) -> -2Math.floor(1.2) -> 1parseInt(-1.2) -> -1
Paul T. Rawkeen 2014年

1
@ PaulT.Rawkeen您还可以使用按位运算符删除小数部分,但请记住,它也将截断为32位。
alex 2014年

2
下面显示了这个答案是不稳定的:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake

4
@Jake 2.3*100javascript中的结果是229.99999999999997,因此在您的示例中似乎按位运算符正在正确执行其工作。
乍得冯瑙

是否有|0使用64位整数的类似解决方案?
克林特(Clint)

49

您还可以使用按位运算符来截断小数。

例如

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

按位运算比数学函数有效得多。双重非按位运算符似乎也略胜于x | 0x << 0按位运算,可忽略不计。

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

还要注意的是,按位非运算符的优先级高于算术运算,因此您可能需要在计算时用括号括起来以得到预期的结果:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

有关双按位非运算符的更多信息,请参见双按位非(~~)


2
可能略有效率。但是,我建议使用“数学”功能,因为它更具可读性。
ashipj '17

机会是,这并不工作,如果该整数没有表示为32位有符号整数(stackoverflow.com/a/7488075/3655192
弘树

30

你也可以

parseInt(a/b)

17
请注意,这parseInt对于大数将不会可靠地起作用,因为它首先将其参数转换为字符串,然后对大数,结果将使用指数表示法。例如:var n = 22222222222222222222222; parseInt(n);将返回2,因为n.toString()回报2.2222222222222223e+22

2
它也没有使用parseInt()它的目的,即将一个数字作为字符串并返回a Number
Alex

22

您还可以使用以下代码在小数点后显示一定位数(此处为2位):

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
请注意,toFixed()返回的是字符串,而不是数字。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…–让
米歇尔·科特

1
当OP要求删除小数部分时,这是一个怎样的答案
Isaac

3
尽管它返回一个字符串,但是您可以使用Number()方法来更正它。.Number((15.46974).toFixed(2))
iPzard

13

使用Math.round()功能。

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
为了完整起见,这是纯JavaScript,而不是查询。
戴夫牛顿

1
$.round = Math.round;)
alex 2014年


6

在ES2015中,Math.trunc()可用。

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

IE11或更低版本不支持此功能,但可以在Edge和其他所有现代浏览器中使用。


2
知道允许截断到X个小数位的任何变化吗?认为这样Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)可行会天真吗?
jamiebarrow16年

2
嗨,杰米(Jamie),这似乎适用于大多数情况,但很容易受到浮点陷阱的影响。例如value = 2.3x = 2将返回2.29。我没有更好的建议。
乍得冯瑙

对我来说,这听起来像是正确的答案。上或下无四舍五入。负数没有问题。只需舍弃小数。按照问题的要求。
恩里克·莫雷诺

2

如果您不在乎路由,只需将数字转换为字符串,然后删除句点之后的所有内容,包括句点。无论是否有小数,这都有效。

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed的行为类似于回合。

对于类似行为的地板,请使用%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
为什么您觉得这比使用Math.floor更好?您的解决方案似乎过于复杂且缓慢。我不知道Math.floor的工作方式,但我希望它会进行更多优化。另外,我想知道您的解决方案是否可能会遇到浮点舍入错误。
Hans Roerdinkholder

1

这是在以上文章的帮助下进行的详细解释:

1. Math.trunc():用于删除那些后跟点的数字。它隐式转换。但是,IE不支持。

例:

Math.trunc(10.5)// 10

Math.trunc(-10.5)// -10

其他替代方式:使用按位非运算符:

例:

x = 5.5

~~ x // 5

2. Math.floor():用于给出可能的最小整数值。所有浏览器均支持。

例:

Math.floor(10.5)// 10

Math.floor(-10.5)// -11

3. Math.ceil():用于给出最大可能的整数值。所有浏览器均支持。

例:

Math.ceil(10.5)// 11

Math.ceil(-10.5)// -10

4. Math.round():四舍五入到最接近的整数。所有浏览器均支持。

例:

Math.round(10.5)// 11

Math.round(-10.5)// -10

Math.round(10.49)// 10

Math.round(-10.51)// -11


0

对于ES6实施,请使用如下所示的内容:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

这是针对那些希望防止用户输入小数的用户

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>


0

例如:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

要么

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
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.