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

  • ABC News (Australia)

    ABC News (Au

    9 HAZİRAN 2008
  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009