Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   определить число целое или нет (https://javascript.ru/forum/misc/29063-opredelit-chislo-celoe-ili-net.html)

dadli 13.06.2012 18:25

определить число целое или нет
 
здравствуите

хочу понимать число целое или нет, сделаю так
var bla = 3.9;
    if (Math.ceil(bla) - bla > 0) {
    	alert("bla не целое число");
    }
    else {
    	alert("bla целое число");
    }

но интересно не сушествует более громатни способ? что-то наподобие такого функции is_float() ?

devote 13.06.2012 18:27

var bla = 3.9;

if ((bla+"").indexOf(".") > 0) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}
или
var bla = 3.9;

if ( parseInt(bla) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

var bla = 45;

if ( parseInt(bla) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

oneguy 13.06.2012 22:06

var bla = 0.0000001;
	 
	if ((bla+"").indexOf(".") > 0) {
	    alert("bla не целое число");
	} else {
	    alert("bla целое число");//этот работает
	}

Поэтому первое решение devote неправильное.

Deff 13.06.2012 22:21

var bla = 0.0000001;
	if ( ((1+bla)+"").indexOf(".") > 0 ) {
	    alert("bla не целое число");
	} else {
	    alert("bla целое число");//этот работает
	}

melky 13.06.2012 22:50

Нужно ли считать 4.0 нецелым числом?
function isFloat(num) {
    return num.toFixed() != num;
}

alert( true === isFloat(3.9) === !isFloat(4) === !isFloat(4.0) === isFloat(4.000000001) );

devote 13.06.2012 22:50

Ну используйте значит второй вариант:
var bla = 0.0000001;

if ( parseInt( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}
или тот что показал Deff

devote 13.06.2012 22:51

Цитата:

Сообщение от melky
Нужно ли считать 4.0 нецелым числом?

если такое попадается, то это уже не число а строка.
var bla = 4.0;

if ( parseInt( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

melky 13.06.2012 22:52

Цитата:

Сообщение от devote (Сообщение 181259)
если такое попадается, то это уже не число а строка.

Кстати, почему ноль отбрасывается?
alert( 4.0 );

devote 13.06.2012 22:54

Цитата:

Сообщение от melky
Кстати, почему ноль отбрасывается?

потому что интерпретатор число переводит в целое число, если у него нет остатков, или остаток нулевой.

Aetae 13.06.2012 23:26

Цитата:

Сообщение от melky (Сообщение 181257)
Нужно ли считать 4.0 нецелым числом?

Тогда уж так:
function isFloat(num) { return parseInt( num ) !== parseFloat( num ) }
alert([
isFloat('4.0'),
isFloat('4'),
isFloat(4),
isFloat(4.1)
].join('\n'));



=)

Deff 13.06.2012 23:35

Ксать, раз такая тема
Не поделитесь самым коротким кодом определения : Чёт/Нечёт (Часто востребовано...

devote 13.06.2012 23:42

Цитата:

Сообщение от Deff
Не поделитесь самым коротким кодом определения : Чёт/Нечёт (Часто востребовано...

function isEvenNumber( num ) { return !(num & 1) }

alert([
  isEvenNumber( 1 ),
  isEvenNumber( 2 ),
  isEvenNumber( 3 ),
  isEvenNumber( 4 ),
  isEvenNumber( 5 ),
  isEvenNumber( "4" ),
  isEvenNumber( "5" ),
  isEvenNumber( 1.1 ),
  isEvenNumber( 2.1 )
].join("\n"));

Deff 13.06.2012 23:46

devote,
Спасибо, а есть еще варианты ? (В микроассеблере самый короткий сдвигом разряда

devote 13.06.2012 23:47

Цитата:

Сообщение от Deff
а есть еще варианты ?

а куда еще короче то? обычная проверка наличия первого бита.

Deff 13.06.2012 23:48

Цитата:

Сообщение от devote
а куда еще короче то? обычная проверка наличия первого бита.

ясн (еще не юзал такое
Ксать второй вопрос был более не про длину уже, а нечно подобное(Желательно и для ИЕ
isEvenNumber( num ) у мну в ИЕ не пашет

oneguy 14.06.2012 01:24

Цитата:

Сообщение от Deff (Сообщение 181248)
var bla = 0.0000001;
	if ( ((1+bla)+"").indexOf(".") > 0 ) {
	    alert("bla не целое число");
	} else {
	    alert("bla целое число");//этот работает
	}

Подставьте bla=1e-16 :)
Цитата:

Сообщение от Devote
var bla = 4.0;
 
if ( parseInt( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

Это тоже неправильно, подставьте bla=1e21

devote 14.06.2012 05:37

Цитата:

Сообщение от oneguy (Сообщение 181287)
... Это тоже неправильно, подставьте bla=1e21

Ну подстваил, и что я должен увидеть?
var bla = 1e21;
  
if ( parseInt( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

nerv_ 14.06.2012 09:55

Цитата:

Сообщение от devote (Сообщение 181266)
function isEvenNumber( num ) { return !(num & 1) }

alert([
  isEvenNumber( 1 ),
  isEvenNumber( 2 ),
  isEvenNumber( 3 ),
  isEvenNumber( 4 ),
  isEvenNumber( 5 ),
  isEvenNumber( "4" ),
  isEvenNumber( "5" ),
  isEvenNumber( 1.1 ),
  isEvenNumber( 2.1 )
].join("\n"));

я так понимаю с нецелыми числами оно работать не должно априори
function isEvenNumber( num ) { return !(num & 1) }

alert([
  isEvenNumber( 2.7 ),
  isEvenNumber( 2.8 )
].join("\n"));


на солнце перегрелся :)

devote 14.06.2012 10:41

Цитата:

Сообщение от nerv_
я так понимаю с нецелыми числами оно работать не должно априори

для не целых чисел используется другой алгорит хранения дынных в памяти, а он проверяет бит в на уровне целого числа.

nerv_ 14.06.2012 10:50

devote, спасибо за ответ) Я это уже понял, поэтому и написал, что
Цитата:

Сообщение от nerv_
на солнце перегрелся

но пост решил оставить. Поразрядные операторы работают только с целыми. Т.е. дробная часть попросту будет отброшена.

извините )

oneguy 14.06.2012 11:09

Цитата:

Сообщение от devote
у подстваил, и что я должен увидеть?
var bla = 1e21;	   
	if ( parseInt( bla ) != bla ) {
	    alert("bla не целое число");
	} else {
	    alert("bla целое число");
	}

То, что bla не целое число, хотя оно на самом деле целое.

devote 14.06.2012 14:21

Цитата:

Сообщение от oneguy
То, что bla не целое число, хотя оно на самом деле целое.

на самом деле оно у вас в голове целое, как и у нас тоже.. но не в JavaScript у него извините нет столько памяти что бы держать огромные числа с высокой точностью. Он выделяет память под число, и если оно не лезет в выделенный размер, он его режет, от того точность числа сразу же теряется, и для JavaScript оно становится не целым.

Советую почитать литературу по числа в JS.

oneguy 14.06.2012 19:57

Цитата:

Сообщение от devote (Сообщение 181376)
на самом деле оно у вас в голове целое, как и у нас тоже.. но не в JavaScript у него извините нет столько памяти что бы держать огромные числа с высокой точностью. Он выделяет память под число, и если оно не лезет в выделенный размер, он его режет, от того точность числа сразу же теряется, и для JavaScript оно становится не целым.

В Джаваскрипте числовые значения хранятся в формате double-precision, в котором числа записываются до 52-го двоичного знака после плавающей запятой. Вообще, целые числа для записи в этот формат всегда округляются в целые (или +/-Infinity), но более того, в данном случае числовое значение литерала 1e21 будет в точности 10^21, так как 10^21 меньше 2^70 и делится на 2^21, то есть все единицы в двоичной записи числа 10^21 находятся с 21-го по 69-ый разряды, что в разности даёт не больше 52.

Джэксон 14.06.2012 20:25

Во сделал своим методом ;)
bla1=4.5;
bla2=4.0;
if(/^[0-9][.][1-9]/.test(bla1)) {alert('bla1 ne celoe chislo');
}
else { alert('bla1 celoe chislo');}
if(/^[0-9][.][1-9]/.test(bla2)) {alert('bla2 ne celoe chislo');
}
else { alert('bla2 celoe chislo');}

devote 14.06.2012 20:29

oneguy,
ну да вы правы.. для числа с 20-ю нулями конечно вариант говно.
var bla = 1e21;    

if ( Math.round( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

var bla = 1.1;

if ( Math.round( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

var bla = "15";

if ( Math.round( bla ) != bla ) {
    alert("bla не целое число");
} else {
    alert("bla целое число");
}

oneguy 14.06.2012 21:08

Вот и прекрасно! По-видимому, лучшего способа, чем через Math.floor, Math.ceil или Math.round, не существует.

Octane 14.06.2012 21:28

Столько вариантов и почему-то никто не воспользовался тем, что остаток от деления целого числа на 1 равен 0
function isInt(x) {return x % 1 == 0}

oneguy 14.06.2012 21:41

Да, действительно, это ещё одно решение.

Джэксон 14.06.2012 22:56

Цитата:

Сообщение от Octane (Сообщение 181529)
Столько вариантов и почему-то никто не воспользовался тем, что остаток от деления целого числа на 1 равен 0
function isInt(x) {return x % 1 == 0}

нее.. тут хитро. а если нецелое число = 5,2552. Тогда при делении на 1 частное не будет равно нулю. Тогда тоже надо писать функцию для проверки целое частное или нет:D

Octane 14.06.2012 22:59

лучше проверять, прежде чем писать ;)


Часовой пояс GMT +3, время: 11:54.