Как я могу проверить, что число с плавающей запятой или целое число? - PullRequest
668 голосов
/ 08 октября 2010

Как узнать, что число float или integer?

1.25 --> float  
1 --> integer  
0 --> integer  
0.25 --> float

Ответы [ 41 ]

5 голосов
/ 07 мая 2013

Любое число с плавающей точкой с нулевой десятичной частью (например, 1.0, 12.00, 0.0) неявно приводится к Integer, поэтому невозможно проверить, является ли оно Float или нет.

4 голосов
/ 15 июля 2013
!!(24%1) // false
!!(24.2%1) // true
4 голосов
/ 08 декабря 2013
var isInt = function (n) { return n === (n | 0); };

Не было случая, чтобы это не делало работу.

4 голосов
/ 11 октября 2018

Как насчет этого?

isFloat(num) {
    return typeof num === "number" && !Number.isInteger(num);
}
3 голосов
/ 19 ноября 2012

Это действительно не должно быть так сложно. Числовые значения целочисленных эквивалентов parseFloat () и parseInt () будут одинаковыми. Таким образом вы можете сделать так:

function isInt(value){ 
    return (parseFloat(value) == parseInt(value)) && !isNaN(value);
}

Тогда

if (isInt(x)) // do work

Это также позволит проверять строки и, следовательно, не является строгим. Если вам нужно решение с сильным типом (иначе не будет работать со строками):

function is_int(value){ return !isNaN(parseInt(value * 1) }
3 голосов
/ 08 октября 2010

Это действительно зависит от того, чего вы хотите достичь. Если вы хотите «подражать» языкам со строгой типизацией, я советую вам не пытаться. Как уже упоминалось, все числа имеют одинаковое представление (одинакового типа).

Используя что-то вроде Клаудиу при условии:

isInteger( 1.0 ) -> true

, который выглядит хорошо для здравого смысла, но в чем-то вроде C вы получите false

3 голосов
/ 24 января 2014

Это просто как:

if( n === parseInt(n) ) ...

Попробуйте это в консоли:

x=1;
x===parseInt(x); // true
x="1";
x===parseInt(x); // false
x=1.1;
x===parseInt(x); // false, obviously

// BUT!

x=1.0;
x===parseInt(x); // true, because 1.0 is NOT a float!

Это смущает многих людей. Всякий раз, когда что-то .0, это больше не плавание. Это целое число. Или вы можете просто назвать это «числовой вещью», потому что нет строгого различия, как тогда, в C. Старые добрые времена.

Таким образом, в принципе, все, что вы можете сделать, это проверить целое число, приняв тот факт, что 1.000 является целым числом.

Интересное примечание

Был комментарий об огромных числах. Огромные цифры не означают никаких проблем для этого подхода; всякий раз, когда parseInt не может обработать число (потому что оно слишком большое), оно возвращает что-то другое, чем фактическое значение, поэтому тест возвращает FALSE. Это хорошо, потому что если вы считаете что-то «числом», вы обычно ожидаете, что JS сможет рассчитать с ним - так что да, числа ограничены, и parseInt примет это во внимание , чтобы выразить это способ.

Попробуйте это:

<script>

var a = 99999999999999999999;
var b = 999999999999999999999; // just one more 9 will kill the show!
var aIsInteger = (a===parseInt(a))?"a is ok":"a fails";
var bIsInteger = (b===parseInt(b))?"b is ok":"b fails";
alert(aIsInteger+"; "+bIsInteger);

</script>

В моем браузере (IE8) это возвращает "a в порядке; b терпит неудачу", что именно из-за огромного числа в b. Предел может варьироваться, но я думаю, что 20 цифр "должно быть достаточно для всех", чтобы процитировать классический :))

3 голосов
/ 29 марта 2018

Это решение сработало для меня.

<html>
<body>
  <form method="post" action="#">
    <input type="text" id="number_id"/>
    <input type="submit" value="send"/>
  </form>
  <p id="message"></p>
  <script>
    var flt=document.getElementById("number_id").value;
    if(isNaN(flt)==false && Number.isInteger(flt)==false)
    {
     document.getElementById("message").innerHTML="the number_id is a float ";
    }
   else 
   {
     document.getElementById("message").innerHTML="the number_id is a Integer";
   }
  </script>
</body>
</html>
2 голосов
/ 23 августа 2011

ЭТО ЗАКЛЮЧИТЕЛЬНЫЙ КОД ДЛЯ ПРОВЕРКИ ОБА И INTO FLOAT

function isInt(n) { 
   if(typeof n == 'number' && Math.Round(n) % 1 == 0) {
       return true;
   } else {
       return false;
   }
} 

ИЛИ

function isInt(n) {   
   return typeof n == 'number' && Math.Round(n) % 1 == 0;   
}   
2 голосов
/ 23 сентября 2015

Я написал функцию, которая принимает строки (если кому-то понадобится)

function isInt(x) {
    return !isNaN(x) && eval(x).toString().length == parseInt(eval(x)).toString().length
}

function isFloat(x) {
    return !isNaN(x) && !isInt(eval(x)) && x.toString().length > 0
}

пример выходных данных:

console.log(isFloat('0.2'))  // true
console.log(isFloat(0.2))    // true
console.log(isFloat('.2'))   // true
console.log(isFloat('-.2'))  // true
console.log(isFloat(-'.2'))  // true
console.log(isFloat(-.2))    // true
console.log(isFloat('u.2'))  // false
console.log(isFloat('2'))    // false
console.log(isFloat('0.2u')) // false

console.log(isInt('187'))  // true
console.log(isInt(187))    // true
console.log(isInt('1.2'))  // false
console.log(isInt('-2'))   // true
console.log(isInt(-'1'))   // true
console.log(isInt('10e1')) // true
console.log(isInt(10e1))   // true
...