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

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • SoundHound

    SoundHound

    8 Mart 2006