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

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • Official Clouds

    Official Clo

    1 HAZİRAN 2011
  • RiceBunny

    RiceBunny

    16 ŞUBAT 2006