【问题标题】:isNaN() javascript, number with 2 commasisNaN() javascript,带有 2 个逗号的数字
【发布时间】:2015-12-19 04:10:24
【问题描述】:

我正在使用百分比和setInterval(),所以我有一个

    var intervalId;
    function randomize(){
       var prc = $("#prc").val();
       var c = 0 ;
       if (!intervalId){
          intervalId = setInterval(function(){
              c = c + 1;
              var attempt = Math.random() * 100;
              if (attempt <= prc){
                  clearInterval(intervalId);
                  intervalId = false;
                  $("#attemptnbr").val(c);
              }
          }, 100);
       }
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

Percentage : <input type="text" id="prc"/>
<button onclick="randomize()">GO</button>
Number of attempts :<input type="text" id="attemptnbr"/>

但实际上如果用户将#prc 输入设置为50.345.34attempt &lt;= prc 条件总是返回true。 当此输入设置为50.345.34 之类的数字时,我尝试使用console.log(isNaN(prc)),它总是返回false

为什么它被认为是一个数值?

【问题讨论】:

    标签: javascript random numbers setinterval percentage


    【解决方案1】:

    但实际上如果用户将 #prc 输入设置为 50.345.34,则尝试

    很确定这是观察错误。您的 prc 是一个字符串,然后将由 &lt;= 运算符隐式转换为数字。该数字将为NaN,因为“50.345.34”无法隐式转换,并且使用NaN 的关系永远不会为真。

    但是它并没有真正改变你想要做的事情,即将prc 转换为数字故意并测试结果:

    var intervalId;
    function randomize(){
       var prc = +$("#prc").val();
       //        ^------------------- Note the +, that converts it to a number
       if (isNaN(prc)) {
           // Handle the invalid input
           return;
       }
       var c = 0 ;
       if (!intervalId){
          intervalId = setInterval(function(){
              c = c + 1;
              var attempt = Math.random() * 100;
              if (attempt <= prc){
                  clearInterval(intervalId);
                  intervalId = false;
                  console.log(attempt);
              }
          }, 100);
       }
    }
    

    我应该注意,如果输入是,上面可能会做一些你不想要的事情:它将使用值0,因为+""0。如果你不想这样,你可以这样做:

    var prcString = $.trim($("#prc").val());
    var prc = +prcString;
    if (!prcString) {
        // Handle the fact they didn't enter anything
        return;
    }
    if (isNaN(prc)) {
        // Handle the invalid input
        return;
    }
    

    【讨论】:

    • 即使&lt;input type="number" name="prc"&gt;这个输入值不是数字吗?
    • @TerryRapt:是的,inputvalue始终是一个字符串,即使对于新的输入类型也是如此。 jQuery 的 val 只会返回一个字符串(如果您调用它的 jQuery 集中有任何元素)或 undefined(如果该集完全为空,但我假设这不适用于您的情况)。
    • 感谢您提供所有这些信息,这对我很有帮助。
    • @TerryRapt:我很高兴。我在结尾处添加了一条注释,我应该早点在那里。
    • @hindmost: No. parseIntparseFloat 在第一个无效字符处停止,返回字符串开头处的数字(如果有)。但是Number 和隐式转换(如&lt;=,我上面使用的一元+,或*/-)转换(或未能转换)整体 字符串。所以parseInt("50.345.34")50parseFloat("50.345.34")50.345+"50.345.34"NaN。不幸的是(在我看来),有一个奇怪的例外,即隐式转换将空白字符串("")转换为0
    【解决方案2】:

    因为$("#prc").val() 返回一个字符串。 50.345.34 是一个字符串。 比较字符串和数字时,js会比较字符串长度和数值。

    【讨论】:

    • "当你比较字符串和数字时,js会比较字符串长度和数值。" 不,当你对字符串和数字使用关系运算符时,字符串隐式转换为数字,然后比较两个数字。
    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2013-06-16
    相关资源
    最近更新 更多