如何在JavaScript中区分一个十进制浮点数和整数

时间:2015-08-25 17:27:50

标签: javascript types floating-point integer decimal

我使用函数来验证作为参数传递的数字在JavaScript中是浮点数还是整数。
该方法适用于诸如' 4.34'即小数为非零,但对于诸如' 3.0'之类的数字则失败,返回整数而不是浮点数。
这是我到目前为止能够提出的代码

function dataType(x) {
    if (typeof x === 'number' && ){
        if (Math.round(x) === x ){
            return 'integer';
        }
        return 'float';
    }
}

console.log(dataType(8)); //integer
console.log(dataType(3.01)); //float
console.log(dataType(3.0)); // should return float

我非常感谢有关如何在JavaScript中执行此操作的一些帮助 提前谢谢。

更新:我希望console.log(dataType(3.0));返回浮动。

5 个答案:

答案 0 :(得分:4)

JS中的每个数字都是浮点数。 JS中只有一种数字类型(Number)。

因此,没有跨浏览器方式来保证:

之间的区别
3
3.0
3.0000000000000

等等。

即使在现代浏览器中,(3.0000).toString( ) === "3"; //true

尝试在JS中强制执行数字类型安全是没有意义的 按照数字格式处理数字,根据需要使用所需的精度转换为字符串和字符串。

答案 1 :(得分:0)

试试这个

function dataType(x) {
    if (typeof x === 'number' ){
        if (Math.round(x) === x && x.toString().indexOf('.') < -1 ){
            return 'integer';
        }
        return 'float';
    }
}

答案 2 :(得分:0)

也许您更改输入,然后比较所做的更改?

这方面的事情,(当然可以通过某种方式简化)例如:

function isFloat(x){ // example: x = 3.00 or x = 3.99

  if( typeof x === 'number' ){

      var obj = {};
      obj.ceil = false;
      obj.floor = false;
      obj.round = false;

      if( Math.ceil(x+0.1) === x ){
        obj.ceil = true;
      }
      if(Math.floor(x+0.1) === x ){
        obj.floor = true;
      }
      if (Math.round(x) === x ){
          obj.round = true;
      }

      if( obj.round == true){ // or use obj.floor?
        return "integer";
      }
      if( (obj.floor == true) && (obj.round == true) ) { // either && or || not sure
        return 'float';
      }
    }
}

例如,通过使用这些值3.00和3.99,我们获得了这些“个人资料”,可用于识别数字(类似于指纹):

(需要对更多的数字类型进行附加测试(我只用笔和纸测试了这两个数字),但我认为这可行)

isFloat(3.00){
  ceil  is false
  floor is true
  round is true
}

isFloat(3.99){
  ceil  is false
  floor is false
  round is false
}

答案 3 :(得分:0)

我想我已经找到了一个更简单且更有效的解决方案:

使用Number.prototype.toFixed()函数。

“锁定”数字,因此JavaScript不允许四舍五入为小于nr的数字。您在括号中指定的小数位数。

let int = 1
let float = 1.0;

console.log( "WARNING: toFixed() returns a: ", typeof float.toFixed(2) ); // string

console.log( "NOTICE: float is still a: ", typeof float ) // float

console.log( int === float , "<--- that is an incorrect result");
console.log( int.toString() === float.toFixed(1) ) // correct result here
console.log( int.toString() == float.toFixed(1) )
console.log( int.toString())
console.log( float.toFixed(1))

// You can "lock" the float variable like this:
float = float.toFixed(1);
// but now float is a: string
console.log( 'NOTICE: the "locked" float is now a: ', typeof float )
console.log( "and that will crash any future atempts to use toFixed() bacause that function does not exist on strings, only on numbers.");
console.log( "Expected crash here: " )
float.toFixed(1)

答案 4 :(得分:0)

一个简单的解决方案: 检查除数和整数形式的余数是否为0。

if(x % parseInt(x) == 0) 
     return 'integer';
 else return 'float';