我如何检查一个数字是浮点数还是整数?
如何find一个数字是float
还是integer
?
1.25 --> float 1 --> integer 0 --> integer 0.25 --> float
检查余数除以1:
function isInt(n) { return n % 1 === 0; }
如果你不知道参数是一个数字,你需要两个testing:
function isInt(n){ return Number(n) === n && n % 1 === 0; } function isFloat(n){ return Number(n) === n && n % 1 !== 0; }
尝试使用这些函数来testing一个值是否是一个没有小数部分的数字原始值,并且在可以被表示为精确整数的大小范围内。
function isFloat(n) { return n === +n && n !== (n|0); } function isInteger(n) { return n === +n && n === (n|0); }
为什么不是这样的:
var isInt = function(n) { return parseInt(n) === n };
有一个名为Number.isInteger()
的方法,目前只在最新的Firefox中实现,并且仍然是EcmaScript 6提议的一部分。 但是, MDN为其他浏览器提供了一个polyfill,它与ECMA和谐中指定的匹配:
if (!Number.isInteger) { Number.isInteger = function isInteger (nVal) { return typeof nVal === "number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; }; }
你可以使用一个简单的正则expression式:
function isInt(value) { var er = /^-?[0-9]+$/; return er.test(value); }
或者你也可以根据你的需要使用下面的function。 它们是由PHPJS项目开发的。
is_int()
=>检查variablestypes是整型还是整数
is_float()
=>检查variablestypes是否为浮点数,以及浮点数是否为浮点数
ctype_digit()
=>检查variablestypes是否是string,以及其内容是否只有十进制数字
更新1
现在它也检查负数,感谢@ChrisBartley评论 !
以下是检查值是数字还是可以安全转换为数字的高效函数:
function isNumber(value) { if ((undefined === value) || (null === value)) { return false; } if (typeof value == 'number') { return true; } return !isNaN(value - 0); }
而对于整数(如果值是一个浮点数将返回false):
function isInteger(value) { if ((undefined === value) || (null === value)) { return false; } return value % 1 == 0; }
这里的效率是parseInt(或parseNumber)被避免时,值已经是一个数字。 这两个parsing函数总是先转换为string,然后尝试parsing该string,如果该值已经是数字,那么这将是浪费。
感谢您在这里的其他post提供进一步的优化思路!
function isInteger(x) { return typeof x === "number" && isFinite(x) && Math.floor(x) === x; } function isFloat(x) { return !!(x % 1); } // give it a spin isInteger(1.0); // true isFloat(1.0); // false isFloat(1.2); // true isInteger(1.2); // false isFloat(1); // false isInteger(1); // true isFloat(2e+2); // false isInteger(2e+2); // true isFloat('1'); // false isInteger('1'); // false isFloat(NaN); // false isInteger(NaN); // false isFloat(null); // false isInteger(null); // false isFloat(undefined); // false isInteger(undefined); // false
function isInt(n) { return n != "" && !isNaN(n) && Math.round(n) == n; } function isFloat(n){ return n != "" && !isNaN(n) && Math.round(n) != n; }
适用于所有情况。
正如其他人所说,你只有JS的双打。 那么你如何定义一个数字是一个整数? 只要检查四舍五入的数字是否等于自己:
function isInteger(f) { return typeof(f)==="number" && Math.round(f) == f; } function isFloat(f) { return typeof(f)==="number" && !isInteger(f); }
以下是我用于整数的内容:
Math.ceil(parseFloat(val)) === val
简短,很好:)工作的所有时间。 这就是大卫·弗拉纳根(David Flanagan)如果我没有弄错的话。
!!(24%1) // false !!(24.2%1) // true
var isInt = function (n) { return n === (n | 0); };
没有一个这样做没有工作的情况下。
任何小数零(例如1.0,12.00,0.0)的浮点数都隐含地转换为整数,所以不可能检查它们是否为浮点数。
这很简单:
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无法处理数字(因为它太大),它会返回除了实际值以外的东西,所以testing将返回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位数“应该足够的任何人”,引用古典:)
这真的取决于你想达到什么。 如果你想“模仿”强types的语言,那么我build议你不要尝试。 正如其他人所说,所有的数字都有相同的表示forms(相同的types)。
使用类似Claudiu提供的:
isInteger( 1.0 )
– > true
这对于常识来说看起来不错,但是像C这样的东西你会得到false
这是最终的代码来检查INT和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; }
function isInteger(n) { return ((typeof n==='number')&&(n%1===0)); } function isFloat(n) { return ((typeof n==='number')&&(n%1!==0)); } function isNumber(n) { return (typeof n==='number'); }
我写了函数接受string(如果有人需要)
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 }
例子ouptuts:
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
整数我用这个
function integer_or_null(value) { if ((undefined === value) || (null === value)) { return null; } if(value % 1 != 0) { return null; } return value; }
它并不一定非常复杂。 整数的parseFloat()和parseInt()等效的数值是相同的。 因此你可以这样做:
function isInt(value){ return (parseFloat(value) == parseInt(value)) && !isNaN(value); }
然后
if (isInt(x)) // do work
这也将允许string检查,因此并不严格。 如果想要一个强大的types解决scheme(又名,将不会使用string):
function is_int(value){ return !isNaN(parseInt(value * 1) }
在Java脚本中,所有的数字都是internally 64 bit floating point
,与java中的double相同。 在javascript中没有不同的types,所有的都由typesnumber
表示。 所以你不能做一个检查的instanceof
。 然而,你可以使用上面给出的解决scheme来找出它是否是一个小数。 Java脚本的devise者感觉到一个单一的types,他们可以避免大量的types转换错误。
这可能不像%回答,它可以防止你不必先转换为string,但我还没有见过任何人发布它,所以这里有另一个选项应该工作正常:
function isInteger(num) { return num.toString().indexOf('.') === -1; }
这是我的代码。 它检查以确保它不是一个空string(否则将通过),然后将其转换为数字格式。 现在,取决于你是否希望'1.1'等于1.1,这可能是也可能不是你要找的。
var isFloat = function(n) { n = n.length > 0 ? Number(n) : false; return (n === parseFloat(n)); }; var isInteger = function(n) { n = n.length > 0 ? Number(n) : false; return (n === parseInt(n)); }; var isNumeric = function(n){ if(isInteger(n) || isFloat(n)){ return true; } return false; };
我喜欢这个小函数,对于正整数和负整数都会返回true。
function isInt(val) { return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0"); }
这是因为1或“1”变成了“1.0”,这是NaN()返回false(然后我们否定和返回),但1.0或“1.0”变成“1.0.0”,而“string”变成“string。 0“,这两个都不是数字,所以isNaN()返回false(并且再次取反)。
如果你只想要正整数,就有这个变体:
function isPositiveInt(val) { return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val); }
或者对于负整数:
function isNegativeInt(val) { return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val); }
isPositiveInt()通过在要testing的值之前移动连接的数字string来工作。 例如,isPositiveInt(1)导致isNaN()评估为“01”,评估为false。 同时,isPositiveInt(-1)导致isNaN()评估为“0-1”,其评估为真。 我们否定了回报价值,这给了我们想要的东西。 isNegativeInt()的工作方式类似,但不会否定isNaN()的返回值。
编辑:
我原来的实现也将返回true和数组和空string。 这个实现没有这个缺陷。 如果val不是一个string或数字,或者它是一个空string,在这种情况下使它更快,它也有利于早期返回。 您可以通过replace前两个子句进一步修改它
typeof(val) != "number"
如果你只想匹配文字数字(而不是string)
编辑:
我无法发表评论,所以我把这个添加到我的答案。 @Asok发布的基准信息非常丰富, 然而,最快的函数不符合要求,因为它也返回TRUE浮游物,数组,布尔值和空string。
我创build了下面的testing套件来testing每个函数,并将我的答案添加到列表中(函数8,parsingstring,函数9,但不是):
funcs = [ function(n) { return n % 1 == 0; }, function(n) { return typeof n === 'number' && n % 1 == 0; }, function(n) { return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n); }, function(n) { return n.toString().indexOf('.') === -1; }, function(n) { return n === +n && n === (n|0); }, function(n) { return parseInt(n) === n; }, function(n) { return /^-?[0-9]+$/.test(n.toString()); }, function(n) { if ((undefined === n) || (null === n)) { return false; } if (typeof n == 'number') { return true; } return !isNaN(n - 0); }, function(n) { return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0"); } ]; vals = [ [1,true], [-1,true], [1.1,false], [-1.1,false], [[],false], [{},false], [true,false], [false,false], [null,false], ["",false], ["a",false], ["1",null], ["-1",null], ["1.1",null], ["-1.1",null] ]; for (var i in funcs) { var pass = true; console.log("Testing function "+i); for (var ii in vals) { var n = vals[ii][0]; var ns; if (n === null) { ns = n+""; } else { switch (typeof(n)) { case "string": ns = "'" + n + "'"; break; case "object": ns = Object.prototype.toString.call(n); break; default: ns = n; } ns = "("+typeof(n)+") "+ns; } var x = vals[ii][1]; var xs; if (x === null) { xs = "(ANY)"; } else { switch (typeof(x)) { case "string": xs = "'" + n + "'"; break; case "object": xs = Object.prototype.toString.call(x); break; default: xs = x; } xs = "("+typeof(x)+") "+xs; } var rms; try { var r = funcs[i](n); var rs; if (r === null) { rs = r+""; } else { switch (typeof(r)) { case "string": rs = "'" + r + "'"; break; case "object": rs = Object.prototype.toString.call(r); break; default: rs = r; } rs = "("+typeof(r)+") "+rs; } var m; var ms; if (x === null) { m = true; ms = "N/A"; } else if (typeof(x) == 'object') { m = (xs === rs); ms = m; } else { m = (x === r); ms = m; } if (!m) { pass = false; } rms = "Result: "+rs+", Match: "+ms; } catch (e) { rms = "Test skipped; function threw exception!" } console.log(" Value: "+ns+", Expect: "+xs+", "+rms); } console.log(pass ? "PASS!" : "FAIL!"); }
我也重新把function#8的基准添加到列表中。 我不会公布结果,因为他们有点尴尬(例如,这个function不是很快)。
(删节 – 我删除了成功的testing,因为输出很长)结果如下:
Testing function 0 Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A FAIL! Testing function 1 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 2 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 3 Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false Value: null, Expect: (boolean) false, Test skipped; function threw exception! Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A FAIL! Testing function 4 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 5 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 6 Value: null, Expect: (boolean) false, Test skipped; function threw exception! Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 7 Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A FAIL! Testing function 8 Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 9 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS!
我留下了失败,所以你可以看到每个函数失败的位置,(string)'#'testing,所以你可以看到每个函数如何处理string中的整数和浮点值,因为有些人可能希望这些parsing为数字和一些不得。
在testing的10个function中,实际符合OP要求的function是[1,3,5,6,8,9]
浮动validation条件:
if (lnk.value == +lnk.value && lnk.value != (lnk.value | 0))
整数validation条件:
if (lnk.value == +lnk.value && lnk.value == (lnk.value | 0))
希望这可能会有所帮助。
function int(a) { return a - a === 0 && a.toString(32).indexOf('.') === -1 } function float(a) { return a - a === 0 && a.toString(32).indexOf('.') !== -1 }
如果要排除string,可以添加typeof a === 'number'
。
YourJS provides the following two functions which work for all numbers including returning false
for -Infinity
and Infinity
:
function isFloat(x) { return typeOf(x, 'Number') && !!(x % 1); } function isInt(x) { return typeOf(x, 'Number') && x % 1 == 0; }
Due to the fact that typeOf()
is a YourJS internal function, if you wanted to use these definitions you can download the version for just these functions here: http://yourjs.com/snippets/build/34
Some times Number objects don't allow you to use direct the mod operator (%), if you are facing that case you can use this solution.
if(object instanceof Number ){ if( ((Number) object).doubleValue() % 1 == 0 ){ //your object is an integer } else{ //your object is a double } }
Based on all that I have seen here, I've created my own set of functions to test for what I need:
function NumberValidator() { this.isFloat = function (n) { return typeof(n)==="number" && n === +n && Math.round(n) !== n; }; this.isInteger = function (n) { return typeof(n)==="number" && n === +n && Math.round(n) === n; }; this.isFloatOrInteger = function (n) { return this.isFloat(n) || this.isInteger(n); }; this.isNonZeroFloatOrInteger = function (n) { return this.isFloatOrInteger(n) && n > 0; }; this.isNonZeroInteger = function (n) { return this.isInteger(n) && n > 0; }; }
However, shime 's solution is shorter and with less checks, so it might be a better one.
For those curious, using Benchmark.js I tested the most up-voted answers (and the one posted today) on this post, here are my results:
var n = -10.4375892034758293405790; var suite = new Benchmark.Suite; suite // kennebec .add('0', function() { return n % 1 == 0; }) // kennebec .add('1', function() { return typeof n === 'number' && n % 1 == 0; }) // kennebec .add('2', function() { return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n); }) // Axle .add('3', function() { return n.toString().indexOf('.') === -1; }) // Dagg Nabbit .add('4', function() { return n === +n && n === (n|0); }) // warfares .add('5', function() { return parseInt(n) === n; }) // Marcio Simao .add('6', function() { return /^-?[0-9]+$/.test(n.toString()); }) // Tal Liron .add('7', function() { if ((undefined === n) || (null === n)) { return false; } if (typeof n == 'number') { return true; } return !isNaN(n - 0); }); // Define logs and Run suite.on('cycle', function(event) { console.log(String(event.target)); }).on('complete', function() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }).run({ 'async': true });
0 x 12,832,357 ops/sec ±0.65% (90 runs sampled) 1 x 12,916,439 ops/sec ±0.62% (95 runs sampled) 2 x 2,776,583 ops/sec ±0.93% (92 runs sampled) 3 x 10,345,379 ops/sec ±0.49% (97 runs sampled) 4 x 53,766,106 ops/sec ±0.66% (93 runs sampled) 5 x 26,514,109 ops/sec ±2.72% (93 runs sampled) 6 x 10,146,270 ops/sec ±2.54% (90 runs sampled) 7 x 60,353,419 ops/sec ±0.35% (97 runs sampled) Fastest is 7 Tal Liron