С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
PavelNovichok
22 / 22 / 7
Регистрация: 04.07.2015
Сообщений: 161
1

Почему появляется NaN?

25.06.2016, 11:15. Просмотров 1249. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Скажите пожалуйста, почему в конце программы возле всей суммы появляется NaN, и это происходит, если в поле продуктов
указано хотя бы одно значение, но так не всегда. Объясните, почему появляется NaN.
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Покупки</title>
        <script src="shop.js"></script>
        <link rel="stylesheet" href="shop.css">
    </head> 
    <body>
        <label for="first">Введите название продукта </label><input id="first" type="text"     placeholder="">
        <label for="second">Введите цену продукта </label><input id="second" type="number" placeholder="">
        <button onclick="calc()">Добавить</button>
        <button onclick="result()">Подсчитать</button>
        <br><br><br><br>
        <div id="list"></div>
        
    </body>
    </html>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var first, second, arrfirst, arrsecond; //создание переменных
arrfirst = new Array();// два новых
arrsecond = new Array();// массива
function calc() {
    first = document.getElementById('first').value; // взятие первого значения
    second = document.getElementById('second').value; // взятие второго значения
    arrfirst.splice(0,0, first); // добавление текстовых значений в массив
    arrsecond.splice(0,0, second); // добавление числовых значений
    
    document.getElementById('first').value = '';
    document.getElementById('second').value = '';
}
 
 
function result(){
    var res = 0; //переменная для полной цены  
    for(var i = 0; i != arrsecond.length; i++){ // цикл для сложения цифр из массива arrsecond
       if((i % 2) == 0) { // условие чтобы 2 одинаковых элемента массива arrsecond не   
       //складывались
       res += parseInt(arrsecond[i]) + parseInt(arrsecond[i + 1]); //сложение элементов массива
        }
    }
    document.write('Все продукты: ' + arrfirst + '<br>' + 'Вся сумма: ' + res + ' единиц. <br>' + arrsecond);// Вывод всех результатов
    //document.write(res);
}
Вот скриншот:
Вложение 711185
Вложение 711186
С уважением, Павел.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2016, 11:15
Ответы с готовыми решениями:

Почему выражение возвращает NaN?
Math.ceil((4/3)*Math.PI*Math.pow(rEnd, 3)) Все скобки стоят правильно, не...

Выдает NaN
Здравствуйте. Я новичок в написании сайтов, обучаюсь сам, и возникла ошибка,...

значение NaN
Здраствуйте, скажите почему не выполняется условие result==NaN, ведь в...

Заклятая NaN
Здравствуйте, вот есть проблема, при выводе alert ответ NaN var a; var b;...

Результат NaN
Результат a + b = NaN, Не могу найти ошибку. Помогите новичку. ...

3
dzendev
163 / 88 / 45
Регистрация: 12.03.2016
Сообщений: 235
25.06.2016, 19:07 2
Я бы начал с этой строчки кода:
Javascript
1
res += parseInt(arrsecond[i]) + parseInt(arrsecond[i + 1]);
Если пользователь добавит только один товар, а затем нажмёт "Подсчитать", эта строка кода выдаст NaN.
1. arrsecond[i + 1] - undefined (значение не определено, второго товара нет)
2. parseInt(arrsecond[i + 1]) - при попытки преобразовать undefined в число будет NaN (не число)
3. parseInt(arrsecond[i]) + parseInt(arrsecond[i + 1]) - число + NaN будет NaN
0
PavelNovichok
22 / 22 / 7
Регистрация: 04.07.2015
Сообщений: 161
25.06.2016, 21:31  [ТС] 3
Но один товар добавлять нет смысла, а если добавляю несколько товаров, то иногда складывается нормально, а иногда - выдает NaN. Не могу уже 2 или 3 дня разобраться.
0
dzendev
163 / 88 / 45
Регистрация: 12.03.2016
Сообщений: 235
25.06.2016, 22:38 4
Лучший ответ Сообщение было отмечено PavelNovichok как решение

Решение

Цитата Сообщение от PavelNovichok Посмотреть сообщение
Но один товар добавлять нет смысла
Что значит нет смысла? Ваш код позволяет это сделать. Значит надо переписать реализацию так чтобы нельзя было организовать подсчёт пока не будет добавлено как минимум 2 товара.
Это был первый момент.
Второй момент, Ваш код позволяет, не указав цену товара, добавить его. А это приводит к тому что, при попытки использовать ParseInt возвращаемое значение будет NaN.
И третье. Значение NaN появляется тогда, когда кол-во добавленных товаров будет нечётным (3, 5, ...)

Добавлено через 51 минуту
Вот такой Вам код в качестве решения могу предложить.
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Покупки</title>
    </head> 
    <body>
        <label for="name">Введите название продукта </label><input id="name" type="text"     placeholder="">
        <label for="price">Введите цену продукта </label><input id="price" type="number" placeholder="">
        <button id="add">Добавить</button>
        <button id="total" disabled>Подсчитать</button>
        <br><br><br><br>
        <div id="error"></div>
        <div id="list-name"></div>
        <div id="list-price"></div>
        <script>
            (function () {
                var name = document.getElementById('name'), 
                    price = document.getElementById('price'),
                    error = document.getElementById('error'),
                    add = document.getElementById('add'),
                    total = document.getElementById('total'),
                    listName = document.getElementById('list-name'),
                    listPrice = document.getElementById('list-price'),
                    names = [], prices = [];
                
                add.addEventListener('click', function () {
                    var n = name.value,
                        p = parseInt(price.value, 10);
                    
                    name.style.border = '1px solid black';
                    price.style.border = '1px solid black';
 
                    if(n === ''){
                        error.innerHTML = 'Введите название продукта';
                        name.style.borderColor = 'red';
                        return false;
                    }
 
                    if( isNaN(p) ){
                        error.innerHTML = 'Введите цену';
                        price.style.borderColor = 'red';
                        return false;
                    }
 
                    if(prices.length > 0){
                        total.disabled = false;
                    }
 
                    names.push(n);
                    prices.push(p);
 
                    name.value = '';
                    price.value = '';
                    error.innerHTML = '';
 
                });
 
                total.addEventListener('click', function () {
                    listName.innerHTML = '';
                    var n = '<ul>';
                    names.forEach(function (index) {
                        n += '<li>' + index + '</li>';
                    }, 0);
                    n += '</ul>';
                    listName.innerHTML = n;
 
                    listPrice.innerHTML = '';
                    var p = prices.reduce(function (sum, current) {
                        return sum + current;
                    }, 0);
                    listPrice.innerHTML = p;
                });
            })();
        </script>
    </body>
    </html>
Демонстрация http://codepen.io/anon/pen/EyZLYN
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2016, 22:38

Выводит NaN!
Есть 2 текстовых поля, туда нужна ввести любую букву английского или же...

Проверка на NaN
Привет. У меня есть два textbox и textarea. В оба textbox вводятся числа,...

parseInt($(this).text() = NaN
Вечер добрый. Требуется записать в тег значение равное (нынешнее значение -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru