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

  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • pjtoohot

    pjtoohot

    15 NİSAN 2008
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006