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

  • BuzzFeedVideo

    BuzzFeedVide

    10 AĞUSTOS 2011
  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • Watcher3223

    Watcher3223

    15 Kasım 2007