如何区分JavaScript中的一位小数浮点数和整数

How to differentiate between a one-decimal float and integer in JavaScript

我正在使用一个函数来验证作为参数传递的数字是 JavaScript 中的浮点数还是整数。
该方法适用于诸如“4.34”之类的数字,即具有非零小数的数字,但它不适用于诸如“3.0”之类的数字,returning 整数而不是浮点数。
这是我到目前为止能够想出的代码

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)); 到 return 浮动。

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

因此,没有跨浏览器的方式来保证两者之间的区别:

3
3.0
3.0000000000000

等等。

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

试图在 JS 中强制转换或强制数字类型安全是毫无意义的。
处理数字格式的数字,根据需要使用所需的精度将其转换为字符串和从字符串转换为字符串。

我认为这是不可能的,除非您可以在值变成数字之前访问该值的字符串表示形式。 JavaScript 丢弃此信息。

您要解决的问题是什么?

试试这个

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

也许如果您更改输入,并比较更改后的效果?

沿着这条线的东西,(当然可以以某种方式简化)例如:

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,我们得到这些 "profiles" 可用于识别数字(类似于指纹):

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

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

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

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

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

"locks" 数字因此 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)

一个简单的解决方案: 检查数字除以整数版本的余数是否为0.

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