SORU
8 EYLÜL 2011, PERŞEMBE


Matematik.() rastgele değeri birden büyük getiriler?

Etrafında JavaScript rastgele sayı ile oynarken şaşırtıcı bir hata, muhtemelen Google Chrome V8 JavaScript motoru keşfettim. Düşünün:

// Generate a random number [1,5].
var rand5 = function() {
  return parseInt(Math.random() * 5)   1;
};

// Return a sample distribution over MAX times.
var testRand5 = function(dist, max) {
  if (!dist) { dist = {}; }
  if (!max) { max = 5000000; }
  for (var i=0; i<max; i  ) {
    var r = rand5();
    dist[r] = (dist[r] || 0)   1;
  }
  return dist;
};

Şimdi ben çalıştırmak testRand5() aldığım aşağıdaki sonuç (tabii, biraz farklı olan her çalışma, ihtiyacın olabilir, "max" için daha yüksek bir değer ortaya çıkarmak hata):

var d = testRand5();
d = {
  1: 1002797,
  2: 998803,
  3: 999541,
  4: 1000851,
  5: 998007,
  10: 1 // XXX: Math.random() returned 4.5?!
}

İlginçtir, node.js bana özel Krom değil düşünmesine benzer sonuçlar görüyorum. Bazen farklı veya birden fazla gizem değerleri (7, 9, vb.).

Herkes sonuçları elde olabilirim niçin görüyorum? parseInt (Math.floor()) yerine kullanma ile ilgili bir şey olduğunu tahmin ediyorum ama yine de olabilirdi neden emin değilim.

CEVAP
8 EYLÜL 2011, PERŞEMBE


Kenar durum çok küçük bir sayı, bir değer ifade oluşturmak için ne zaman, örneğin bu 9.546056389808655e-8 gibi oluşur.

parseInt, ile birlikteyorumlar bir dize değişkenicehennem gevşek tatili. Ve beni daha önce de belirtildiği gibi Math.floor kullanarak çözülebilir.

Bu kod parçası ile kendiniz deneyin:

var test = 9.546056389808655e-8;

console.log(test); // prints 9.546056389808655e-8
console.log(parseInt(test)); // prints 9 - oh noes!
console.log(Math.floor(test)) // prints 0 - this is better

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • krotoflik

    krotoflik

    26 ŞUBAT 2011
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010