Проблема с прибавлением
Я захотел сделать калькулятор на 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> |
z = parseInt(x)+parseInt(y) |
Лучше вместо parseInt() использовать Number(), т.к. число не обязательно может быть целое.
|
Нет, лучше сразу к типу приводить:
<script type="text/javascript"> var x = +prompt("Введите число", "Число"); var y = +prompt("Введите число 2", "Число 2"); var z = x + y; document.write(z); </script> |
Maxmaxmахimus, масон web-программер! Афигеть =)
|
Maxmaxmахimus,
Ты написал тоже, что и я =/ |
Товарищи масоны, мы тут похихикали... а сегодня я столкнулся с задачкой на эту тему и уже не очень смешно. Не буду открывать новую тему, продолжу в этой.
Задачка такая: имеется число 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'! Как быть? Прошу помощь из зала ;) |
Цитата:
|
Цитата:
|
Цитата:
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); |
Маэстро,
попробуйте библиотеки для работы с большими числами например <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> |
Цитата:
Но, библиотека - лишние 50 KByte, а главное, что к сожалению Ваш пример на тест '999999999999999999999999999' возвращает '999999999999999999999999999000000' (с лишними нулями). Возможно надо попробовать брать длину исходной строки и после преобразования обрезать длину результирующей строки до длины исходной. Однако есть и другие неприятности, например реакция на всякие undefined, null, NaN,... Думаю, что следует пойти по следующему пути в два шага: 1. преобразовать входную величину x в строку. 2. проверить с помощью regexp.test() наличие в x только символов цифр (0...1). При наличии только символов цифр оставить исходную строку без изменений, в противном случае присвоить ей '0'. |
Цитата:
я умножил '999999999999999999999999999' на 1000000 чтобы продемонстрировать операции с большими числами |
Pavel M., да, простите, я сначала это видел, а потом чем-то отвлекся и на момент тестирования Вашей функции уже забыл ;)
|
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 01:57. |