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
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;
}
Neden karma fonksiyonları bir asal say...
Neden MongoDB Java driver rastgele bir...
Neden insanlar rastgele bir sayı kulla...
Neden C rand() büyüklükte aynı sırada ...
Neden fonksiyon işaretçi tanımları ve ...