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

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, время: 18:41.