SORU
5 EYLÜL 2013, PERŞEMBE


Neden son Sayı (1) yazılı?

Kod:

<?php
$start = 0;
$stop  = 1;
$step = ($stop - $start)/10;
$i = $start   $step;
while ($i < $stop) {
    echo($i . "<br/>");
    $i  = $step;
}
?>

Çıkış:

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1 <-- notice the 1 printed when it shouldn't

fiddle yarattı

Eğer iyi çalışır $start = 1 $stop = 2 ayarlarsanız. bir tane daha:

Kullanarak: php 5.3.27

Neden 1 basılı mı?

CEVAP
5 EYLÜL 2013, PERŞEMBE


Matematik kusurludur yüzer değil sadece, çünkü, bazen gösterimi is flawed too - ve bu durumda işte.

Aslında 0.1, 0.2, ... - ve bu oldukça kolay kontrol için alamadım:

$start = 0;
$stop  = 1;
$step = ($stop - $start)/10;
$i = $start   $step;
while ($i < $stop) {
   print(number_format($i, 32) . "<br />");
   $i  = $step;
}

Tek fark, burada gördüğünüz gibi, echo number_format arama yerine. Ama sonuçları büyük ölçüde farklı

0.10000000000000000555111512312578
0.20000000000000001110223024625157
0.30000000000000004440892098500626
0.40000000000000002220446049250313
0.50000000000000000000000000000000
0.59999999999999997779553950749687
0.69999999999999995559107901499374
0.79999999999999993338661852249061
0.89999999999999991118215802998748
0.99999999999999988897769753748435

Gördün mü? Sadece bir kez bu numarayı yüzen bir kap içinde saklanabilir çünkü 0.5 aslında. Diğerleri sadece yaklaşımlar vardı.

Sorun nasıl çözülür? Evet, radikal bir yaklaşım yüzer kullanarak değil, ama benzer durumlarda tamsayı. Kolay de bunu yaptın dikkat edin

$start = 0;
$stop  = 10;
$step = (int)(($stop - $start) / 10);
$i = $start   $step;
while ($i < $stop) {
   print(number_format($i, 32) . "<br />");
   $i  = $step;
}

... bu iş Tamam olur:

Alternatif olarak, number_format bazı dize içine kaydır dönüştürmek, önceden biçimlendirilmiş şamandıra bu dize ile karşılaştırmak için kullanabilirsiniz. Bu gibi:

$start = 0;
$stop  = 1;
$step = ($stop - $start) / 10;
$i = $start   $step;
while (number_format($i, 1) !== number_format($stop, 1)) {
   print(number_format($i, 32) . "\n");
   $i  = $step;
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesome Toys TV

    Awesome Toys

    18 HAZİRAN 2014
  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011