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

  • After Effects Tutorials w/ Mikey

    After Effect

    24 HAZİRAN 2009
  • Lena Danya

    Lena Danya

    11 NİSAN 2010
  • vgeller1

    vgeller1

    22 Kasım 2009