65

在做一个项目时,我遇到了一个由前雇员创建的 JS 脚本,它基本上以以下形式创建报告

Name : Value
Name2 : Value2

等等

问题是这些值有时可以是浮点数(具有不同的精度)、整数,甚至是2.20011E+17. 我要输出的是纯整数。不过,我不太了解 JavaScript。我将如何编写一种方法来获取这些有时浮点数并使它们成为整数?

4

8 回答 8

103

如果您需要四舍五入到一定位数,请使用以下功能

function roundNumber(number, digits) {
            var multiple = Math.pow(10, digits);
            var rndedNum = Math.round(number * multiple) / multiple;
            return rndedNum;
        }
于 2009-01-25T22:40:38.377 回答
51

您必须将输入转换为数字,然后将它们四舍五入:

function toInteger(number){ 
  return Math.round(  // round to nearest integer
    Number(number)    // type cast your input
  ); 
};

或作为一个班轮:

function toInt(n){ return Math.round(Number(n)); };

使用不同的值进行测试:

toInteger(2.5);           // 3
toInteger(1000);          // 1000
toInteger("12345.12345"); // 12345
toInteger("2.20011E+17"); // 220011000000000000
于 2008-10-29T11:23:00.163 回答
30

根据ECMAScript 规范,JavaScript 中的数字仅由双精度 64 位格式 IEEE 754 表示。因此 JavaScript 中实际上没有整数类型。

关于这些数字的四舍五入,有多种方法可以实现这一点。Math对象为我们提供了三种可以使用的舍入方法:

Math.round()是最常用的,它返回四舍五入到最接近整数的值。然后是Math.floor()返回小于或等于数字的最大整数。最后,我们有Math.ceil()函数,它返回大于或等于数字的最小整数。

还有一个toFixed(),它使用定点表示法返回一个表示数字的字符串。

Ps.:Math.round()方法中没有第二个参数。toFixed()不是IE 特定的,它也在ECMAScript 规范中

于 2008-10-29T10:46:39.677 回答
25

这是一种能够Math.round()与第二个参数(四舍五入的小数位数)一起使用的方法:

// 'improve' Math.round() to support a second argument
var _round = Math.round;
Math.round = function(number, decimals /* optional, default 0 */)
{
  if (arguments.length == 1)
    return _round(number);

  var multiplier = Math.pow(10, decimals);
  return _round(number * multiplier) / multiplier;
}

// examples
Math.round('123.4567', 2); // => 123.46
Math.round('123.4567');    // => 123
于 2012-05-04T16:53:48.853 回答
20

您也可以使用toFixed(x)ortoPrecision(x)其中x是位数。

所有主流浏览器都支持这两种方法

于 2012-05-07T09:59:48.743 回答
16

您可以使用Math.round()将数字四舍五入到最接近的整数。

Math.round(532.24) => 532

此外,您可以使用parseInt()parseFloat()将变量转换为某种类型,在本例中为整数和浮点。

于 2008-10-29T09:19:50.897 回答
0

一个非常好的舍入近似值:

function Rounding (number, precision){

var newNumber;
var sNumber = number.toString();

var increase = precision + sNumber.length - sNumber.indexOf('.') + 1;

if (number < 0)
  newNumber = (number -  5 * Math.pow(10,-increase));
else
  newNumber = (number +  5 * Math.pow(10,-increase));

var multiple = Math.pow(10,precision);

return Math.round(newNumber * multiple)/multiple;
}

只有在某些情况下,数字的小数部分长度很长时才会出错。

于 2013-09-11T12:41:24.727 回答
-1

Math.floor(19.5) = 19 也应该有效。

于 2014-05-15T22:56:10.503 回答