Перевірте, чи число має десяткове місце / це ціле число


284

Я шукаю простий спосіб у JavaScript перевірити, чи є в ньому число десяткового знаку (щоб визначити, чи є цілим числом). Наприклад,

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

Відповіді:


820

Використання модуля буде працювати:

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

10
Я не відмовився від голосування, але скажу, що це стосується 20,0, все ще має десяткову точку і задовольняє вищесказаному. +1 у мене все одно, що ви навчаєте мене чомусь новому :)
Abe Petrillo

7
@Abe: досить правда, хоча я думаю, що це малоймовірно. Неможливо сказати, чи 20.0є десяткова крапка програмно, якщо вона не виражається як рядок. Крім того, жодне з інших рішень не отримало голосування за те, щоб не боротися з цим ;-)
Енді Е

1
@SREEP: див. Коментарі вище. 0,00 не є 0,00 в JavaScript, якщо воно представлене як числове значення. Він може бути представлений у вигляді рядка ("0,00"), в цьому випадку питання для цього - "перевірити, чи рядок - це ціле число", а не "перевірити, чи число - це ціле число" .
Енді Е

3
@Swanidhi: що ти маєш на увазі? Що не буде дійсним? "10."це ціле число, і результат буде точно таким же, як "10"або 10.
Енді Е

3
ОП запитує про перевірку, чи НОМЕР є цілим числом. Він ніде не згадує рядків - з цього приводу відповідь Енді правильна.
Ом Шанкар

58
Number.isInteger(23);  // true
Number.isInteger(1.5); // false
Number.isInteger("x"); // false: 

Number.isInteger () є частиною стандарту ES6 і не підтримується в IE11.

Вона повертає неправдиві для NaN, Infinityі не числових аргументів в той час як x % 1 != 0повертає істину.


2
рішення не вдається на 12.0
Вікас Арора

@VikasArora Ні, це працює за призначенням. Number.isInteger(12.0)повертає true.
le_m

Це здається, що це має бути правильна відповідь, але, на жаль, це не працює для наукових позначень, наприклад, Number.isInteger('1e3')є false, хоча Number.isInteger(1e3)це правда. Якщо припустити, що питання питання полягає у знаходженні не цілих значень (а не фактичної присутності десяткової крапки у представленні), то значення рядка '12 .0 ' повинно пройти, оскільки воно являє собою ціле число, але знову ж таки Number.isInteger('12.0')є false.
brianmearns

Питання @brianmearns OP - numberце ціле чи ні. Якщо ваш вхід - це рядок, вам потрібно перетворити його в numberперший, наприклад, через parseFloat(), звичайно.
le_m

47

Або ви можете просто скористатися цим, щоб дізнатися, чи НЕ є десятковою:

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

2
Я думаю, що це справжнє рішення, оскільки це працює навіть для XX.0
Deepankar Sarkar

5
перетворити на рядок, перш ніж продовжувати .. тобто: yournumber.toString.indexOf(".")
Даніель Омін

1
francisco_ssb .. символ точки є універсальним ... представляє десяткове місце в математичній мові .. це універсально і має працювати в будь-якій країні. Якщо ви говорите про коми (","), ви повинні перетворити на крапку (".") Перед indexOf ("."), Очевидно ..
Даніель Омін

1
Я думаю, коли він мав на увазі, що це не працює в деяких країнах, він має на увазі валюту, оскільки Євро використовує кому замість десяткової крапки. Однак питання не стосується валюти, а лише десяткових знаків ... як у частці числа.
Тесса

1
Це не працює, якщо десяткова величина становить 1,00, і ви хочете, щоб це було int, якщо ви не примушуєте значення
simon-pr

21

Найбільш поширене рішення - зняти цілу частину числа і порівняти його з нулем так:

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

31
Чому б не просто startVal != Math.floor(startVal)?
Енді Е

2
Приємно. Та сама концепція, але ваша версія ще чистіша.
Томас

1
@Andy E: Це можливо лише для позитивних чисел. Це не працюватиме за від’ємними цифрами ..
Seeya K

3
@SeeyaK: звичайно, це буде працювати для негативних чисел. Спробуйте спробувати.
Енді Е

1
@DeepakGoyal - Це дизайн. Math.FloorФункція приймає значення десяткового і найбільше значення десяткового допускається в JavaScript є 2^53 - 1або 9007199254740991. Оскільки 893144042145698745.3більший, ніж цей максимум, функція вийде з ладу.
Томас

20

Просто, але ефективно!

Math.floor(number) === number;

4
@OmShankar ефективний! = Дієвий
Fiddles

Math.floor(3.0) == 3.0це правда, Math.floor(3.3) == 3.3помилково
Ромер

@Fiddles, про правильно, це те, що я хотів сказати: не ефективний , так як це відбувається набагато повільніше в продуктивності в порівнянні з методом% мод. Дякуємо за виправлення
Om Shankar

19

// Як щодо його байта?

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

Я завжди відчуваю себе погано для бітових операторів у JavaScript-

вони навряд чи отримують будь-які вправи.


14
Це не вдається для цілих чисел, більших за 2 ^ 31 - 1, оскільки >>перетворює значення в підписане 32-бітове ціле число .
Меттью Крамлі

1
@kennebec awesome - це, безумовно, найсмішніше рішення. І це біса набагато краще, ніж RegEx.
Даніель Б. Чапман

5
number = 20.5

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

alert("Integer")

} else {

alert("Decimal")

}

Дуже круто і працює для таких речей, як XX.0! Це працює тому, що Math.floor () відбиває будь-яку десяткову, якщо вона має одну, якщо підлога відрізняється від початкового числа, ми знаємо, що це десятковий! І ніяких рядкових перетворень :)


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

4
Невдачі для num= 999999999999999999999.
bobince

1
перетворити спочатку в рядок, а потім зробити повторно.
ghostdog74

Працював для мене без перетворення на рядок.
Abe Petrillo

4

Number.isInteger()є, мабуть, найбільш стислим. Він повертає true, якщо це ціле число, і false, якщо це не так.


1
Це має бути прийнятою відповіддю, оскільки краще використовувати модуль через рядкові проблеми.
Іні

3
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;
}

Не потрібно пояснення. Це досить просто.
Грант Бірхмайер

1
Якщо рядок містить будь-яке значення у strCheck, це десятковий ... (він відсутній.., Хоча ...
NicoJuicy

2
parseInt(num) === num

коли передано число, parseInt()просто повертає число як int:

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

4
Мені це дуже подобається, але це залежить від конкретних потреб. На жаль, мені потрібна функція, parseInt(3.0) === 3.0 // true
ЯКЩО

2

перетворити числовий рядок у масив, розділений на десяткові крапки. Тоді, якщо масив має лише одне значення, це означає, що в рядку немає десяткових знаків.

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
}

1

Ось уривок з моєї бібліотеки охоронців (натхненний Ефективним 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

1

Ви можете помножити його на 10, а потім зробити " модульну " операцію / поділ на 10 , і перевірити, чи результат цього двох операцій дорівнює нулю. Результат цих двох операцій дасть вам першу цифру після коми після коми. Якщо результат дорівнює нулю, то число - це ціле число.

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


1

Ви можете використовувати побітові операції, які не змінюють значення ( ^ 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


1

Ви можете скористатися такою функцією, щоб перевірити, чи число має десяткові знаки:

function hasDecimal(num){
    return !!(num % 1);
}

console.log(hasDecimal(2)); //false
console.log(hasDecimal(2.32423)); //true

Тому, мабуть, деякі користувачі хочуть пояснень. Я розбию його на шматки: (кількість% 1)

Середина парентезу виконує ці операції спочатку. num - змінна, передана функцією. % - символ модуля, який намагається розділити ліве число на праве. Якщо є залишок, він повертає його як десятковий. Якщо вона ділиться рівномірно, вона повертає 0.

Отже, підсумуйте те, що ми маємо досі., (Число% 1) повернеться:

0, якщо розділити рівномірно АБО #. #####, якщо ні

0 == false.

[ANY_NUMBER_NOT_ZERO] == вірно.

Приклади: new Boolean (0) false false new Boolean (12312.1231) true

Інші альтернативи: Користувач міг би спробувати повернути значення (num% 1)., Що в основному дозволить досягти того ж самого. Оскільки return (0) є хибним, а return (1.213113) - істинним.

Але я хотів повернути бульне значення. Отже, як ярлик, щоб примусити значення в логічне значення, я додав! символ перед ним.

Стільки, скільки може знати.,! означає НЕ. Але це також змушує значення перетворюватися на булеве значення.

З тих пір! symobol змушує значення в булеве, і воно перевертає його значення. Я використовую !! щоб примусити значення в булеве значення і повернути його значення до початкового булевого значення.

введіть тут опис зображення


Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Nic3500

0

Функція контрольного номера - десятковий або ціле число

function IsDecimalExist(p_decimalNumber) {
    var l_boolIsExist = true;

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

    return l_boolIsExist;
}

0

Можливо, це працює для вас?

Він використовує регулярний вираз, щоб перевірити, чи є в номері кома, а якщо немає, то додасть кому та смужку.

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

Ласкаво просимо до StackOverflow. Не могли б ви пояснити, що робить цей код і чому, на вашу думку, він вирішить проблему.
Квінз

@quinz Він використовує регулярний вираз, щоб перевірити, чи є в номері кома, а якщо немає, то він додасть кому та смужку. Отже, це те, що задається питанням, за допомогою додаткової функціональності додавання форматування для округлих цінників.
користувач11608734

0

Використовуйте наступне, якщо значення є рядковим (наприклад, від <input):

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

Я додаю .toString()підлогу, щоб він працював також у випадках, коли value == "1."(закінчується десятковим роздільником або іншим рядком). Також Math.floorзавжди повертає якесь значення, тому .toString()ніколи не виходить з ладу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.