Javascript function with Nan error

Asked

Viewed 1,152 times

3

Hello.

I am encountering a problem when executing this formula as the final answer is given as Nan.

In a simplified way to explain the code, it works like this: there are two groups of three variables, and depending on the value you assign to each of them, it is worth a certain amount of points. For example, if the number 89 is assigned to the variable (NUMERO2), its equivalent in the other group, the variable (BPM_TRUE) will be equal to 3 points. At the end, the three main variables are multiplied and summed from a specific formula, resulting in the value of (RTS_TRUE).

Can anyone understand what’s going on? I’ve tried to switch to float, but without success.

<body>
  <script type="text/javascript">
    // <![CDATA[
    /* Calculadora RTS Ivana Mendonca */

    var ECG_TRUE;
    var NUMERO1;
    if (NUMERO1 == '15' || NUMERO1 == '14' || NUMERO1 == '13') {
      ECG_TRUE = 4
    } else
    if (NUMERO1 == '09' || NUMERO1 == '10' || NUMERO1 == '11' || NUMERO1 == '12') {
      ECG_TRUE = 3
    } else
    if (NUMERO1 == '06' || NUMERO1 == '07' || NUMERO1 == '08') {
      ECG_TRUE = 2
    } else
    if (NUMERO1 == '04' || NUMERO1 == '05') {
      ECG_TRUE = 1
    } else
    if (NUMERO1 == '00') {
      ECG_TRUE = 0
    }

    var BPM_TRUE;
    var NUMERO2;
    if (NUMERO2 > '89') {
      BPM_TRUE = 4
    } else
    if (NUMERO2 == '89' || NUMERO2 == '88' || NUMERO2 == '87' || NUMERO2 == '86' || NUMERO2 == '85' || NUMERO2 == '84' || NUMERO2 == '83' || NUMERO2 == '82' || NUMERO2 == '81' || NUMERO2 == '80' || NUMERO2 == '79' || NUMERO2 == '78' || NUMERO2 == '77' || NUMERO2 == '76') {
      BPM_TRUE = 3
    } else
    if (NUMERO2 == '75' || NUMERO2 == '74' || NUMERO2 == '73' || NUMERO2 == '72' || NUMERO2 == '71' || NUMERO2 == '70' || NUMERO2 == '69' || NUMERO2 == '68' || NUMERO2 == '67' || NUMERO2 == '66' || NUMERO2 == '65' || NUMERO2 == '64' || NUMERO2 == '63' || NUMERO2 == '62' || NUMERO2 == '61' || NUMERO2 == '60' || NUMERO2 == '59' || NUMERO2 == '58' || NUMERO2 == '57' || NUMERO2 == '56' || NUMERO2 == '55' || NUMERO2 == '54' || NUMERO2 == '53' || NUMERO2 == '52' || NUMERO2 == '51' || NUMERO2 == '50') {
      BPM_TRUE = 2
    } else
    if (NUMERO2 <= '49' && NUMERO2 != '00') {
      BPM_TRUE = 1
    } else
    if (NUMERO2 == '00') {
      BPM_TRUE = 0
    }

    var FR_TRUE;
    var NUMERO3;
    if (NUMERO3 == '10' || NUMERO3 == '11' || NUMERO3 == '12' || NUMERO3 == '13' || NUMERO3 == '14' || NUMERO3 == '15' || NUMERO3 == '16' || NUMERO3 == '17' || NUMERO3 == '18' || NUMERO3 == '19' || NUMERO3 == '20' || NUMERO3 == '21' || NUMERO3 == '22' || NUMERO3 == '23' || NUMERO3 == '24' || NUMERO3 == '25' || NUMERO3 == '26' || NUMERO3 == '27' || NUMERO3 == '28' || NUMERO3 == '29') {
      FR_TRUE = 4
    } else
    if (NUMERO3 > '29') {
      FR_TRUE = 3
    } else
    if (NUMERO3 == '06' || NUMERO3 == '07' || NUMERO3 == '08' || NUMERO3 == '09') {
      FR_TRUE = 2
    } else
    if (NUMERO3 == '01' || NUMERO3 == '02' || NUMERO3 == '03' || NUMERO3 == '04' || NUMERO3 == '05') {
      FR_TRUE = 1
    }
    if (NUMERO3 == '00') {
      FR_TRUE = 0
    }

    var RTS_TRUE;

    NUMERO1 = prompt('ECG:', 'Digite aqui');
    NUMERO2 = prompt('BPM:', 'Digite aqui');
    NUMERO3 = prompt('FR:', 'Digite aqui');

    RTS_TRUE = parseInt(ECG_TRUE) * 0, 9368 + parseInt(BPM_TRUE) * 0, 7326 + parseInt(FR_TRUE) * 0, 2908;

    document.write('O resultado equivale a: ', RTS_TRUE);

    // ]]>
  </script>

</body>

  • Put initial values on all variables: var ECG_TRUE = 0; and the others too.. It’s giving Nan because these variables are coming up empty in the final sum.

  • It is running perfectly, as long as the user type one of the predefined falores in if Else. For example, (NUMERO1) has possibilities from 0 to 15 already defined, but if the user type 16 the final answer will be Nan. The problem is then in setting the limits.

  • The value cannot be left blank or return 0 to the sum unless the person type the value '00' in the prompt field of one of the values. Otherwise, the sum will be altered. Imagine intubating a patient unnecessarily just because the calculator added up to 0 for a typo... This won’t end well.

4 answers

1

In JavaScript decimal numbers are represented with . (point) and not with , (comma).

That part of the code:

RTS_TRUE = parseInt(ECG_TRUE) * 0, 9368 + parseInt(BPM_TRUE) * 0, 7326 + parseInt(FR_TRUE) * 0, 2908;

Should be:

RTS_TRUE = parseInt(ECG_TRUE) * 0.9368 + parseInt(BPM_TRUE) * 0.7326 + parseInt(FR_TRUE) * 0.2908;

Another error is that you are using the values of NUMERO1, NUMERO2 and NUMERO3, before capturing them using the function prompt.

Soon it will be like this:

<body>
  <script type="text/javascript">
    // <![CDATA[
    /* Calculadora RTS Ivana Mendonca */
    var NUMERO1, NUMERO2, NUMERO3;
    
    NUMERO1= prompt('ECG:', 'Digite aqui');
    NUMERO2 = prompt('BPM:', 'Digite aqui');
    NUMERO3 = prompt('FR:', 'Digite aqui');    

    var ECG_TRUE;
    if (NUMERO1 == '15' || NUMERO1 == '14' || NUMERO1 == '13') {
      ECG_TRUE = 4
    } else
    if (NUMERO1 == '09' || NUMERO1 == '10' || NUMERO1 == '11' || NUMERO1 == '12') {
      ECG_TRUE = 3
    } else
    if (NUMERO1 == '06' || NUMERO1 == '07' || NUMERO1 == '08') {
      ECG_TRUE = 2
    } else
    if (NUMERO1 == '04' || NUMERO1 == '05') {
      ECG_TRUE = 1
    } else
    if (NUMERO1 == '00') {
      ECG_TRUE = 0
    }

    var BPM_TRUE;
    if (NUMERO2 > '89') {
      BPM_TRUE = 4
    } else
    if (NUMERO2 == '89' || NUMERO2 == '88' || NUMERO2 == '87' || NUMERO2 == '86' || NUMERO2 == '85' || NUMERO2 == '84' || NUMERO2 == '83' || NUMERO2 == '82' || NUMERO2 == '81' || NUMERO2 == '80' || NUMERO2 == '79' || NUMERO2 == '78' || NUMERO2 == '77' || NUMERO2 == '76') {
      BPM_TRUE = 3
    } else
    if (NUMERO2 == '75' || NUMERO2 == '74' || NUMERO2 == '73' || NUMERO2 == '72' || NUMERO2 == '71' || NUMERO2 == '70' || NUMERO2 == '69' || NUMERO2 == '68' || NUMERO2 == '67' || NUMERO2 == '66' || NUMERO2 == '65' || NUMERO2 == '64' || NUMERO2 == '63' || NUMERO2 == '62' || NUMERO2 == '61' || NUMERO2 == '60' || NUMERO2 == '59' || NUMERO2 == '58' || NUMERO2 == '57' || NUMERO2 == '56' || NUMERO2 == '55' || NUMERO2 == '54' || NUMERO2 == '53' || NUMERO2 == '52' || NUMERO2 == '51' || NUMERO2 == '50') {
      BPM_TRUE = 2
    } else
    if (NUMERO2 <= '49' && NUMERO2 != '00') {
      BPM_TRUE = 1
    } else
    if (NUMERO2 == '00') {
      BPM_TRUE = 0
    }

    var FR_TRUE;
    if (NUMERO3 == '10' || NUMERO3 == '11' || NUMERO3 == '12' || NUMERO3 == '13' || NUMERO3 == '14' || NUMERO3 == '15' || NUMERO3 == '16' || NUMERO3 == '17' || NUMERO3 == '18' || NUMERO3 == '19' || NUMERO3 == '20' || NUMERO3 == '21' || NUMERO3 == '22' || NUMERO3 == '23' || NUMERO3 == '24' || NUMERO3 == '25' || NUMERO3 == '26' || NUMERO3 == '27' || NUMERO3 == '28' || NUMERO3 == '29') {
      FR_TRUE = 4
    } else
    if (NUMERO3 > '29') {
      FR_TRUE = 3
    } else
    if (NUMERO3 == '06' || NUMERO3 == '07' || NUMERO3 == '08' || NUMERO3 == '09') {
      FR_TRUE = 2
    } else
    if (NUMERO3 == '01' || NUMERO3 == '02' || NUMERO3 == '03' || NUMERO3 == '04' || NUMERO3 == '05') {
      FR_TRUE = 1
    }
    if (NUMERO3 == '00') {
      FR_TRUE = 0
    }

    var RTS_TRUE;

    RTS_TRUE = parseInt(ECG_TRUE) * 0.9368 + parseInt(BPM_TRUE) * 0.7326 + parseInt(FR_TRUE) * 0.2908;

    document.write('O resultado equivale a: ', RTS_TRUE);
    // ]]>
  </script>
</body>

  • I did, but you keep making the same mistake :/

  • 1

    You have to put the prompt at the beginning of the function too. I forgot to put this in the answer.

  • Already edited, see if it solves your problem.

  • Look at the pub I just made of the updated code. It ran perfectly, then I emailed it and closed. When I opened it again, it was no longer running. It also only ran once on the recipient’s pc, then gave Nan again.

  • 1

    In the case of NUMERO1 do not fall under any of the conditions, what should be the value of ECG_TRUE? Zero?

  • Now I get it! I do nursing, and I’m daring to do something computing for an extra university project. The variables are depictions of the Glasgow Coma Scale, N° of heartbeat and Respiratory Frequency. Each has a minimum and maximum value. For example, Glasgow varies from 3 to 15. Then the person would have to enter a value within these values, otherwise an Alarm would appear talking to correct, correct?

  • 1

    That’s right, and since you didn’t start the variable with any value, it’s worth null and probably that makes you have Nan as a result.

Show 2 more comments

1

A suggestion with optimizations in the code, and using some functions:

var ECG_TRUE,
BPM_TRUE,
FR_TRUE;

checa = {
   ECG: function(NUMERO1) {
       if (NUMERO1 == null){
          return null;
       } else
       if (NUMERO1 >= 13 && NUMERO1 <= 15) {
         ECG_TRUE = 4
       } else
       if (NUMERO1 >= 9 && NUMERO1 <= 12) {
         ECG_TRUE = 3
       } else
       if (NUMERO1 >= 6 && NUMERO1 <= 8) {
         ECG_TRUE = 2
       } else
       if (NUMERO1 == 4 || NUMERO1 == 5) {
         ECG_TRUE = 1
       } else
       if (NUMERO1 == 0) {
         ECG_TRUE = 0
       }else{
          alert("Número inválido!");
          return false;
       }
       return true;
   },
   BPM: function(NUMERO2) {
       if (NUMERO2 == null){
          return null;
       } else
       if (NUMERO2 > 89) {
         BPM_TRUE = 4
       } else
       if (NUMERO2 >= 76 && NUMERO2 <= 89) {
         BPM_TRUE = 3
       } else
       if (NUMERO2 >= 50 && NUMERO2 <= 75) {
         BPM_TRUE = 2
       } else
       if (NUMERO2 <= 49 && NUMERO2 != 0) {
         BPM_TRUE = 1
       } else
       if (NUMERO2 == 0) {
         BPM_TRUE = 0
       }
       return true;
   },
   FR: function(NUMERO3) {
       if (NUMERO3 == null){
          return null;
       } else
       if (NUMERO3 >= 10 && NUMERO3 <= 29) {
         FR_TRUE = 4
       } else
       if (NUMERO3 > 29) {
         FR_TRUE = 3
       } else
       if (NUMERO3 >= 6 && NUMERO3 <= 9) {
         FR_TRUE = 2
       } else
       if (NUMERO3 >= 1 && NUMERO3 <= 5) {
         FR_TRUE = 1
       } else
       if (NUMERO3 == 0) {
         FR_TRUE = 0
       }
       return true;
   }
}

function perguntar(){
   p1 = checa.ECG(prompt('ECG:', 'Digite aqui'));
   
   if(p1){
      p2 = checa.BPM(prompt('BPM:', 'Digite aqui'));

      if(p2){
         p3 = checa.FR(prompt('FR:', 'Digite aqui'));
         
         if(p3){

            var RTS_TRUE;
   
            RTS_TRUE = parseInt(ECG_TRUE) * 0.9368 + parseInt(BPM_TRUE) * 0.7326 + parseInt(FR_TRUE) * 0.2908;
   
            document.write('O resultado equivale a: '+ RTS_TRUE);
         }
      }
   }else if(p1 != null){
      perguntar();
   }
}

perguntar();

1

Comrade, you are giving Not a Number(Nan) pq if you enter a value that is not within the comparisons, no value will be set in the variables ECG_TRUE, BPM_TRUE and FR_TRUE. So instead of comparing at the end with 0, I put as default option if it doesn’t match any tested value before. (but check if this influences your calculation)

<body>
    <script type="text/javascript">
    // <![CDATA[
        /* Calculadora RTS Ivana Mendonca */

         var NUMERO1, NUMERO2, NUMERO3;

            NUMERO1 = prompt('ECG:', 'Digite aqui');
            NUMERO2 = prompt('BPM:', 'Digite aqui');
            NUMERO3 = prompt('FR:', 'Digite aqui');   
            
            NUMERO1 = parseInt(NUMERO1);
            NUMERO2 = parseInt(NUMERO2);
            NUMERO3 = parseInt(NUMERO3);

        var ECG_TRUE;
            if (NUMERO1 == 15 || NUMERO1 == 14 || NUMERO1 == 13) 
            {
              ECG_TRUE=4;
            }   
            else
            if (NUMERO1 == 9 || NUMERO1 == 10 || NUMERO1 == 11 || NUMERO1 == 12) 
            {
              ECG_TRUE=3; 
            }    
            else
            if (NUMERO1 == 6 || NUMERO1 == 7
                 || NUMERO1 == 8) 
            {
              ECG_TRUE=2;
            }    
            else
            if (NUMERO1 == 4 || NUMERO1 == 5) 
            {
              ECG_TRUE=1;
            }    
            else
            {
              ECG_TRUE=0;
            }  


        var BPM_TRUE;
            if (NUMERO2 > 89) 
            {
              BPM_TRUE=4;
            }    
            else
            if (NUMERO2 == 89 || NUMERO2 == 88 || NUMERO2 == 87 || NUMERO2 == 86 || NUMERO2 == 85 || NUMERO2 == 84 || NUMERO2 == 83 || NUMERO2 == 82 || NUMERO2 == 81 || NUMERO2 == 80 || NUMERO2 == 79 || NUMERO2 == 78 || NUMERO2 == 77 || NUMERO2 == 76) 
            {
              BPM_TRUE=3;
            }    
            else
            if (NUMERO2 == 75 || NUMERO2 == 74 || NUMERO2 == 73 || NUMERO2 == 72 || NUMERO2 == 71 || NUMERO2 == 70 || NUMERO2 == 69 || NUMERO2 == 68 || NUMERO2 == 67 || NUMERO2 == 66 || NUMERO2 == 65 || NUMERO2 == 64 || NUMERO2 == 63 || NUMERO2 == 62 || NUMERO2 == 61 || NUMERO2 == 60 || NUMERO2 == 59 || NUMERO2 == 58 || NUMERO2 == 57 || NUMERO2 == 56 || NUMERO2 == 55 || NUMERO2 == 54 || NUMERO2 == 53 || NUMERO2 == 52 || NUMERO2 == 51 || NUMERO2 == 50) 
            {
              BPM_TRUE=2;
            }    
            else
            if (NUMERO2 <= 49 && NUMERO2 != 0) 
            {
              BPM_TRUE=1;
            }    
            else
            {
              BPM_TRUE=0;
            } 

            

        var FR_TRUE;
            if (NUMERO3 == 10 || NUMERO3 == 11 || NUMERO3 == 12 || NUMERO3 == 13 || NUMERO3 == 14 || NUMERO3 == 15 || NUMERO3 == 16 || NUMERO3 == 17 || NUMERO3 == 18 || NUMERO3 == 19 || NUMERO3 == 20 || NUMERO3 == 21 || NUMERO3 == 22 || NUMERO3 == 23 || NUMERO3 == 24 || NUMERO3 == 25 || NUMERO3 == 26 || NUMERO3 == 27 || NUMERO3 == 28 || NUMERO3 == 29) 
            {
              FR_TRUE=4;
            } 
            else
            if (NUMERO3 > 29) 
            {
              FR_TRUE=3;
            } 
            else
            if (NUMERO3 == 6 || NUMERO3 == 7 || NUMERO3 == 8 || NUMERO3 == 9) 
            {
              FR_TRUE=2;
            } 
            else
            if (NUMERO3 == 1 || NUMERO3 == 2 || NUMERO3 == 3 || NUMERO3 == 4 || NUMERO3 == 5) 
            {
              FR_TRUE=1;
            }
            else
            {
              FR_TRUE=0;
            } 

        var RTS_TRUE;


      ECG_TRUE = ECG_TRUE * 0.9368;
      
      BPM_TRUE = BPM_TRUE * 0.7326;
      
      FR_TRUE = FR_TRUE * 0.2908;

      RTS_TRUE = ECG_TRUE + BPM_TRUE + FR_TRUE; 

        document.write('O resultado equivale a: ', RTS_TRUE);

    // ]]>
    </script>

</body>

0

The code ran, but soon after stopped again and gave the same answer Nan without that I have made any modifications. Now that I’m not getting any more at all...

I made some corrections and he stayed like this until the moment he spun:

<body>
    <script type="text/javascript">
    // <![CDATA[
        /* Calculadora RTS Ivana Mendonca */

         var NUMERO1, NUMERO2, NUMERO3;

            NUMERO1 = prompt('ECG:', 'Digite aqui');
            NUMERO2 = prompt('BPM:', 'Digite aqui');
            NUMERO3 = prompt('FR:', 'Digite aqui');   

        var ECG_TRUE;
            if (NUMERO1 == 15 || NUMERO1 == 14 || NUMERO1 == 13) {
                ECG_TRUE=4
            }   else
            if (NUMERO1 == 09 || NUMERO1 == 10 || NUMERO1 == 11 || NUMERO1 == 12) 
            {ECG_TRUE=3}    else
            if (NUMERO1 == 06 || NUMERO1 == 07
                 || NUMERO1 == 08) 
            {ECG_TRUE=2}    else
            if (NUMERO1 == 04 || NUMERO1 == 05) 
            {ECG_TRUE=1}    else
            if (NUMERO1 == 00) 
            {ECG_TRUE=0}  

        var BPM_TRUE;
            if (NUMERO2 > 89) 
            {BPM_TRUE=4}    else
            if (NUMERO2 == 89 || NUMERO2 == 88 || NUMERO2 == 87 || NUMERO2 == 86 || NUMERO2 == 85 || NUMERO2 == 84 || NUMERO2 == 83 || NUMERO2 == 82 || NUMERO2 == 81 || NUMERO2 == 80 || NUMERO2 == 79 || NUMERO2 == 78 || NUMERO2 == 77 || NUMERO2 == 76) 
            {BPM_TRUE=3}    else
            if (NUMERO2 == 75 || NUMERO2 == 74 || NUMERO2 == 73 || NUMERO2 == 72 || NUMERO2 == 71 || NUMERO2 == 70 || NUMERO2 == 69 || NUMERO2 == 68 || NUMERO2 == 67 || NUMERO2 == 66 || NUMERO2 == 65 || NUMERO2 == 64 || NUMERO2 == 63 || NUMERO2 == 62 || NUMERO2 == 61 || NUMERO2 == 60 || NUMERO2 == 59 || NUMERO2 == 58 || NUMERO2 == 57 || NUMERO2 == 56 || NUMERO2 == 55 || NUMERO2 == 54 || NUMERO2 == 53 || NUMERO2 == 52 || NUMERO2 == 51 || NUMERO2 == 50) 
            {BPM_TRUE=2}    else
            if (NUMERO2 <= 49 && NUMERO2 != 00) 
            {BPM_TRUE=1}    else
            if (NUMERO2 == 00) 
            {BPM_TRUE=0} 

        var FR_TRUE;
            if (NUMERO3 == 10 || NUMERO3 == 11 || NUMERO3 == 12 || NUMERO3 == 13 || NUMERO3 == 14 || NUMERO3 == 15 || NUMERO3 == 16 || NUMERO3 == 17 || NUMERO3 == 18 || NUMERO3 == 19 || NUMERO3 == 20 || NUMERO3 == 21 || NUMERO3 == 22 || NUMERO3 == 23 || NUMERO3 == 24 || NUMERO3 == 25 || NUMERO3 == 26 || NUMERO3 == 27 || NUMERO3 == 28 || NUMERO3 == 29) 
            {FR_TRUE=4} else
            if (NUMERO3 > 29) 
            {FR_TRUE=3} else
            if (NUMERO3 == 06 || NUMERO3 == 07 || NUMERO3 == 08 || NUMERO3 == 09) 
            {FR_TRUE=2} else
            if (NUMERO3 == 01 || NUMERO3 == 02 || NUMERO3 == 03 || NUMERO3 == 04 || NUMERO3 == 05) 
            {FR_TRUE=1}
            if (NUMERO3 == 00) 
            {FR_TRUE=0} 

        var RTS_TRUE;

        RTS_TRUE = parseInt(ECG_TRUE) * 0.9368 + parseInt(BPM_TRUE) * 0.7326 + parseInt(FR_TRUE) * 0.2908;

        document.write('O resultado equivale a: ', RTS_TRUE);

    // ]]>
    </script>

</body>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.