ChatGPT解决这个技术问题 Extra ChatGPT

检查数字是否有小数位/是否为整数

我正在寻找一种在 JavaScript 中检查数字是否有小数位的简单方法(以确定它是否为整数)。例如,

23 -> OK
5 -> OK
3.5 -> not OK
34.345 -> not OK
if(number is integer) {...}

u
user56reinstatemonica8

使用 modulus 将起作用:

num % 1 != 0
// 23 % 1 = 0
// 23.5 % 1 = 0.5

请注意,这是基于数字的数值,与格式无关。它将包含带有固定小数点的整数的数字字符串视为与整数相同:

'10.0' % 1; // returns 0
10 % 1; // returns 0
'10.5' % 1; // returns 0.5
10.5 % 1; // returns 0.5

我没有投反对票,但我会说它与 20.0 有关,仍然有小数点并满足上述要求。无论如何,我要为我+1,因为它教了我一些新东西:)
@Abe:确实如此,尽管我认为这不太可能。无法以编程方式说 20.0 是否有小数点,除非它表示为字符串。此外,没有其他解决方案因不解决该问题而被否决;-)
@SREEP:见上面的评论。当表示为数字值时,0.00 在 JavaScript 中不是 0.00。它可以表示为字符串(“0.00”),在这种情况下,问题是“检查字符串是否为整数”而不是“检查数字是否为整数”。
@Swanidhi:你是什么意思?什么是无效的? "10." 是一个整数,结果与 "10"10 完全相同。
OP 询问是否检查 NUMBER 是否为整数。他在任何地方都没有提到字符串——在这方面,安迪的回答是正确的。
l
le_m
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger() 是 ES6 标准的一部分,在 IE11 中不受支持。

它为 NaNInfinity 和非数字参数返回 false,而 x % 1 != 0 返回 true。


12.0 解决方案失败
@VikasArora 不,它按预期工作。 Number.isInteger(12.0) 返回 true
@brianmearns OP 的问题是 number 是否完整。如果您的输入是一个字符串,您当然需要先将其转换为 number,例如通过 parseFloat()
如果小数位数过多,这将不起作用:Number.isInteger(2.000000000000000000001) // true
@dYale 这是因为 JavaScript 中的 2.000000000000000000001 === 2
d
dYale

或者您可以使用它来确定它是否不是小数:

string.indexOf(".") == -1;

我认为这是实际的解决方案,因为它甚至适用于 XX.0
在继续之前转换为字符串.. 即:yournumber.toString.indexOf(".")
francisco_ssb ..点符号是通用的...代表数学语言中的小数位..这是通用的,应该适用于任何国家。如果您谈论逗号(“,”),则必须在 indexOf(“。”)之前转换为点(“。”),显然..
我认为当他的意思是它在某些国家不起作用时,他指的是货币,因为欧元使用逗号而不是小数点。然而,这个问题并不特定于货币,只是小数......就像数字的一小部分一样。
如果 decimal 是 1.00 并且您希望它是 int 除非您强制 value,这不起作用
d
dYale

简单但有效!

Math.floor(number) === number;

@OmShankar 高效!= 有效
Math.floor(3.0) == 3.0 为真,Math.floor(3.3) == 3.3 为假
@Fiddles,哦,对了,这就是我想说的:效率不高,因为与 % mod 方法相比,这在性能上要慢得多。感谢指正
T
Thomas

最常见的解决方案是去除数字的整数部分并将其与零进行比较,如下所示:

function Test()
{
     var startVal = 123.456
     alert( (startVal - Math.floor(startVal)) != 0 )
}

为什么不只是 startVal != Math.floor(startVal)
好的。相同的概念,但你的版本更干净。
@Andy E:这仅适用于正数。它不适用于负数..
@SeeyaK:当然它适用于负数。请随时尝试。
@DeepakGoyal - 您提到的问题与在 JavaScript 中处理非常大的数字有关。我怀疑您必须获得一个使用位操作和数组来处理大于 JavaScript 最大数字的值的库。当然,另一种选择不是在 JavaScript 中执行此操作,而是将值传递给服务器端组件,在该组件中您使用可以处理非常大的值的语言或库。
k
kennebec

//对它进行字节处理怎么样?

Number.prototype.isInt= function(){
 return this== this>> 0;
}

我总是觉得 javascript 中的位运算符有点糟糕-

他们几乎没有得到任何锻炼。


这对于大于 2^31 - 1 的整数会失败,因为 >> 会将值转换为有符号 32 位整数
@kennebec 真棒——这是迄今为止最有趣的解决方案。它比 RegEx 好得多。
a
aaditya
Number.isSafeInteger(value);

在 JavaScript 中,isSafeInteger() 是一个 Number 方法,用于返回一个布尔值,指示一个值是否为安全整数。这意味着它是一个整数值,可以精确地表示为 IEEE-754 双精度数而无需四舍五入。


感谢您的回答,这很有效!
J
Jean-François Corbett

Number.isInteger() 可能是最简洁的。如果是整数则返回 true,否则返回 false。


这应该是公认的答案,因为由于字符串问题,它比使用模数更好。
模数运算符在数学上很聪明,这在编程上很聪明,使用已经存在的函数总是更简单(特别是如果它在std中)
虽然 IE 不支持很多东西/j
佚名
number = 20.5

if (number == Math.floor(number)) {

alert("Integer")

} else {

alert("Decimal")

}

很酷,也适用于 XX.0 之类的东西!它之所以有效,是因为 Math.floor() 如果有一个小数,它就会去掉任何小数,所以如果地板与原始数字不同,我们就知道它是一个小数!并且没有字符串转换:)


g
ghostdog74
var re=/^-?[0-9]+$/;
var num=10;
re.test(num);

num= 999999999999999999999 失败。
先转换为字符串,然后再做re。
为我工作而无需转换为字符串。
S
Sirko
function isDecimal(n){
    if(n == "")
        return false;

    var strCheck = "0123456789";
    var i;

    for(i in n){
        if(strCheck.indexOf(n[i]) == -1)
            return false;
    }
    return true;
}

不需要解释。这很简单。
如果字符串包含 strCheck 中的任何值,则它是小数...(他错过了 . 和 ,虽然...
M
Michael
parseInt(num) === num

当传递一个数字时,parseInt() 只是将数字作为 int 返回:

parseInt(3.3) === 3.3 // false because 3 !== 3.3
parseInt(3) === 3     // true

我非常喜欢这个,但取决于一个人的具体需求。不幸的是,我需要一个函数来使测试失败parseInt(3.0) === 3.0 // true
K
Kareem

将数字字符串转换为数组,按小数点分割。然后,如果数组只有一个值,则意味着字符串中没有小数。

if(!number.split(".")[1]){
    //do stuff
}

这样你也可以知道整数和小数实际上是什么。一个更高级的例子是。

number_to_array = string.split(".");
inte = number_to_array[0];
dece = number_to_array[1]; 

if(!dece){
    //do stuff
}

m
michal.jakubeczy

如果值为字符串(例如来自 <input),请使用以下内容:

Math.floor(value).toString() !== value

我将 .toString() 添加到 floor 以使其也适用于 value == "1." (以小数分隔符或其他字符串结尾)的情况。此外,Math.floor 总是返回一些值,因此 .toString() 永远不会失败。


s
schirrmacher

这是我的警卫库的摘录(灵感来自 David Herman 的 Effective JavaScript):

var guard = {

    guard: function(x) {
        if (!this.test(x)) {
            throw new TypeError("expected " + this);
        }
    }

    // ...
};

// ...

var number = Object.create(guard);
number.test = function(x) {
    return typeof x === "number" || x instanceof Number;
};
number.toString = function() {
    return "number";
};


var uint32 = Object.create(guard);
uint32.test = function(x) {
    return typeof x === "number" && x === (x >>> 0);
};
uint32.toString = function() {
    return "uint32";
};


var decimal = Object.create(guard);
decimal.test = function(x) {
    return number.test(x) && !uint32.test(x);
};
decimal.toString = function() {
    return "decimal";
};


uint32.guard(1234);     // fine
uint32.guard(123.4);    // TypeError: expected uint32

decimal.guard(1234);    // TypeError: expected decimal
decimal.guard(123.4);   // fine

B
BSevo

您可以将其乘以 10,然后对 10 进行“模”运算/除法,并检查这两个运算的结果是否为零。这两个操作的结果将为您提供小数点后的第一个数字。如果结果等于零,则该数字是整数。

if ( (int)(number * 10.0) % 10 == 0 ){
// your code
}

S
Steve Brush
function isDecimal(num) {
  return (num !== parseInt(num, 10));
}

m
makovkastar

您可以使用不改变值的按位运算(^ 0~~)丢弃可用于舍入的小数部分。将数字四舍五入后,将其与原始值进行比较:

function isDecimal(num) {
  return (num ^ 0) !== num;
}

console.log( isDecimal(1) ); // false
console.log( isDecimal(1.5) ); // true
console.log( isDecimal(-0.5) ); // true

D
Dmitry Shashurov
function isWholeNumber(num) {
  return num === Math.round(num);
}

E
Eugene Tiurin

也许这对你有用?

它使用正则表达式检查数字中是否有逗号,如果没有,则添加逗号和条纹。

var myNumber = '50';
function addCommaStripe(text){
    if(/,/.test(text) == false){
        return text += ',-';
    } else {
        return text;
    }
}
myNumber = addCommaStripe(myNumber);

欢迎来到 StackOverflow。您能否详细说明此代码的作用以及您认为它会解决问题的原因。
@quinz 它使用正则表达式检查数字中是否有逗号,如果没有,则添加逗号和条纹。因此,它通过添加圆形价格标签格式的附加功能来满足问题的要求。
耶稣,正则表达式无处不在,我想自杀,我为什么要成为开发人员。
d
domaci_a_nas

当使用带小数步长的计数器时,检查数字是否为整数实际上会失败,如下所示。因此,用 9 个(可能更多)小数位格式化数字可能是最安全的(虽然速度很慢),如果它以 9 个零结尾,那么它就是一个整数。

const isRound = number => number.toFixed(9).endsWith('000000000'); for (let counter = 0; counter < 2; counter += 0.1) { console.log({ counter, modulo: counter % 1, formatted: counter.toFixed(9), isRound: isRound(counter) }); }


T
Tom Sabel

校验号的功能是小数或整数

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

    if (p_decimalNumber % 1 == 0)
        l_boolIsExist = false;

    return l_boolIsExist;
}