Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с прибавлением (https://javascript.ru/forum/misc/27265-problema-s-pribavleniem.html)

nemo4430 07.04.2012 16:17

Проблема с прибавлением
 
Я захотел сделать калькулятор на javascript. Отнимание, умножение, деление у меня нормально получилось, а прибавление - не хочет. Когда я хочу прибавить 2 числа, например 6 и 7, то оно пишет не 13, а 67. В чем моя ошибка? Вот код:
<script type="text/javascript"> 
var x = window.prompt("Введите число", "Число");
var y = window.prompt("Введите число 2", "Число 2");
var z = x + y;
document.write(z);
</script>

T-sh 07.04.2012 16:33

z = parseInt(x)+parseInt(y)

Маэстро 07.04.2012 17:50

Лучше вместо parseInt() использовать Number(), т.к. число не обязательно может быть целое.

9xakep 07.04.2012 18:12

Нет, лучше сразу к типу приводить:
<script type="text/javascript"> 
var x = +prompt("Введите число", "Число");
var y = +prompt("Введите число 2", "Число 2");
var z = x + y;
document.write(z);
</script>

GuardCat 07.04.2012 19:38

Maxmaxmахimus, масон web-программер! Афигеть =)

9xakep 07.04.2012 21:04

Maxmaxmахimus,
Ты написал тоже, что и я =/

Маэстро 09.04.2012 20:52

Товарищи масоны, мы тут похихикали... а сегодня я столкнулся с задачкой на эту тему и уже не очень смешно. Не буду открывать новую тему, продолжу в этой.
Задачка такая: имеется число x, которое в процессе работы может принять какое угодно значение. Это может быть число (в идеале), это может быть строка, это может быть undefined, null, false, NaN, ...
Необходимо проверить переменную x и, если в ней целое число, то всё хорошо, а если не число, то обнулить, т.е. присвоить самый настоящий ноль.То есть некоторый аналог PHP-шного
settype($x,"integer");
Далее нужно эту переменную преобразовать в строку.
Вот что у меня получилось:
x = +x; if (isNaN(x)) x = 0;
Может вы придумаете изящнее? Проверил на разных значениях x и всё было хорошо, пока не произошло вот такое:
x=999999999999999999999999;

Если смотреть глазами человека, то это число? -Да! Но если смотреть глазами javascript_а, то это как бы не число, потому что не integer.
Поэтому на выходе (после преобразования х в строку) получаем не '999999999999999999999999', а '1e+24'!
Как быть? Прошу помощь из зала ;)

Kolyaj 11.04.2012 09:02

Цитата:

Сообщение от Маэстро
Но если смотреть глазами javascript_а, то это как бы не число, потому что не integer.

В JS нет integer, есть Number на все числа.

Маэстро 11.04.2012 10:56

Цитата:

Сообщение от Kolyaj (Сообщение 168242)
В JS нет integer, есть Number на все числа.

Сути проблемы это не меняет.

Маэстро 11.04.2012 11:06

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 168247)
function test(x){
   return (Math.round(x) === x && x !== Infinity && x !== -Infinity) ? ''+x : '0';
}

Сначала Вы здесь написали такую функцию:
function test(x){
   return (Math.round(x) === x) ? x : 0;
}
теперь вот такой звездолет:
function test(x){
   return (Math.round(x) === x && x !== Infinity && x !== -Infinity) ? ''+x : '0';
}
А тестировать пробовали? Вот результаты моего тестирования:
x=test(9999);
//результат: 9999

x=test(99999999);      
//результат: 99999999


x=test(999999999999);
//результат: 999999999999

x=test(9999999999999999);
//результат: 10000000000000000


x=test(99999999999999999999);
//результат: 100000000000000000000

x=test(999999999999999999999999);
//результат: 1e+24

document.write(x);

Pavel M. 11.04.2012 11:36

Маэстро,
попробуйте библиотеки для работы с большими числами
например
<script src="http://www.leemon.com/crypto/BigInt.js"></script>
<script>

	var big1 = str2bigInt('999999999999999999999999999', 10, 0);
		big2 = str2bigInt('1000000', 10, 0),
		big3 = mult(big1, big2); // умножаем

	alert(bigInt2str(big3, 10));

</script>

Маэстро 11.04.2012 12:01

Цитата:

Сообщение от Pavel M. (Сообщение 168255)
попробуйте библиотеки для работы с большими числами

За информацию о библиотеке спасибо. Никогда не пользовался.

Но, библиотека - лишние 50 KByte, а главное, что к сожалению Ваш пример на тест
'999999999999999999999999999'
возвращает
'999999999999999999999999999000000' (с лишними нулями).
Возможно надо попробовать брать длину исходной строки и после преобразования обрезать длину результирующей строки до длины исходной.
Однако есть и другие неприятности, например реакция на всякие undefined, null, NaN,...

Думаю, что следует пойти по следующему пути в два шага:
1. преобразовать входную величину x в строку.
2. проверить с помощью regexp.test() наличие в x только символов цифр (0...1). При наличии только символов цифр оставить исходную строку без изменений, в противном случае присвоить ей '0'.

Pavel M. 11.04.2012 12:04

Цитата:

Сообщение от Маэстро
а главное, что к сожалению Ваш пример на тест
'999999999999999999999999999'
возвращает
'999999999999999999999999999000000' (с лишними нулями).

смотрите внимательно код
я умножил '999999999999999999999999999' на 1000000
чтобы продемонстрировать операции с большими числами

Маэстро 11.04.2012 12:45

Pavel M., да, простите, я сначала это видел, а потом чем-то отвлекся и на момент тестирования Вашей функции уже забыл ;)

Маэстро 11.04.2012 15:28

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 168301)
чего тебе не ясно еще?

Мне всё ясно. В частности с Вами.

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 168301)
я тебе дал функцию которая делает то что ты просил? почему тема еще не закрыта?

Ваша функция НЕ ВЫПОЛНЯЕТ то, что я просил.


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