2015-09-22 25 views
5

Tôi đang làm việc với tỷ lệ phần trăm và setInterval() vì vậy tôi có mộtisNaN() javascript, số với 2 dấu phẩy

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"/>

Nhưng trên thực tế nếu người dùng thiết lập các #prc đầu vào 50.345.34, điều kiện attempt <= prc luôn trả về true. Tôi đã cố gắng để console.log(isNaN(prc)) khi đầu vào này được đặt thành một số như 50.345.34 và nó luôn trả về false.

Tại sao nó được coi là giá trị số?

Trả lời

7

Nhưng thực sự nếu người dùng đặt đầu vào #prc thành 50.345.34, cố gắng < = điều kiện prc luôn trả về đúng.

Chắc chắn đó là lỗi quan sát. prc của bạn là một chuỗi, sau đó sẽ được chuyển đổi hoàn toàn thành một số bởi toán tử <=. Số này sẽ là NaN vì "50.345.34" không được chuyển đổi hoàn toàn, và các mối quan hệ sử dụng NaN không bao giờ đúng.

Tuy nhiên nó không thực sự thay đổi những gì bạn muốn làm gì về nó, đó là chuyển đổi prc một số vào mục đích và kiểm tra kết quả:

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); 
    } 
} 

tôi nên lưu ý trên có thể làm một cái gì đó bạn không muốn nếu đầu vào là trống: Nó sẽ sử dụng giá trị 0, bởi vì +""0. Nếu bạn không muốn điều đó, bạn có thể làm điều này:

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; 
} 
+0

Giá trị đầu vào này có phải là số ngay cả khi ''? –

+2

@TerryRapt: Có, 'giá trị' của' đầu vào' là * luôn luôn * một chuỗi, ngay cả đối với các loại đầu vào mới. 'Val' của jQuery sẽ chỉ bao giờ trả về một chuỗi (nếu có bất kỳ phần tử nào trong bộ jQuery bạn gọi nó) hoặc' undefined' (nếu tập hoàn toàn trống, nhưng không áp dụng trong trường hợp của bạn). –

+0

Cảm ơn tất cả những thông tin này, nó thực sự đã giúp tôi. –

0

$("#prc").val() trả về một chuỗi. 50.345.34 là một chuỗi. Khi bạn so sánh chuỗi và số, js sẽ so sánh độ dài chuỗi và giá trị số.

+2

* "Khi bạn so sánh chuỗi và số, js sẽ so sánh độ dài chuỗi và giá trị số." * Không. Khi bạn sử dụng toán tử quan hệ trên chuỗi và một số, chuỗi được chuyển đổi hoàn toàn thành một số và sau đó hai số được so sánh. –

+2

Vâng, bạn nói đúng. Lỗi của tôi. – cassln

Các vấn đề liên quan