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

  • amc

    amc

    21 EYLÜL 2005
  • jocc talking shit

    jocc talking

    6 NİSAN 2007
  • Plugable

    Plugable

    19 Mayıs 2010