2016-10-20 11 views
5

Mam następujący php do pętliPHP wielokrotnego wartość dla pętli

$screen = 1.3; // it can be other decimal value 
    for ($i = 1, $k = 0; $i <= $screen; $i += 0.1, $k+=25) { 
    echo $i . ' - ' . $k . '<br>'; 
} 

To działa dobrze, ale chciałbym, aby uruchomić dla pętli til 1.3 - 75 teraz drukować mi 1.2 - 50. Staram się zmienić $ i < = Ekran $ do ekranu $ i = $, ale nie działa.

+0

Dlaczego używać wartość dziesiętną dla pętli chociaż? – Daan

+0

Zgadzam się z Daanem – Jigar7521

+0

Używam wartości dziesiętnych to moje zadanie:/ –

Odpowiedz

5

Jeśli czytasz http://php.net/manual/en/language.types.float.php jest ładny oświadczenie należy pamiętać:

Testowanie zmiennoprzecinkowych na równość jest problematyczne, ze względu na sposób, w jaki są one reprezentowane wewnętrznie

Aby przetestować wartości zmiennoprzecinkowe dla równości, stosowane jest górne ograniczenie względnego błędu z powodu zaokrąglenia. Ta wartość jest znana jako epsilon maszyny lub zaokrąglenie jednostki i jest najmniejszą dopuszczalną różnicą w obliczeniach.

oparciu o zalecenia tam trzeba zrobić coś takiego:

<?php 
$screen = 1.3; // it can be other decimal value 
$epsilon=0.0001; 
for ($i = 1, $k = 0; $i <= $screen+$epsilon; $i += 0.1, $k+=25) { 
    echo $i . ' - ' . $k . "\n"; 
} 
+0

Thx za opublikowanie tej odpowiedzi, nawet jeśli była ona ode mnie! I duży thx za refrence! Miał prawie podobny problem kilka dni temu, trochę skomplikowany i po prostu pomógł mi go rozwiązać. – Twinfriends

2

dwa roztwory:

$screen = 1.4; // it can be other decimal value 
    for ($i = 1, $k = 0; $i <= $screen; $i += 0.1, $k+=25) { 
    echo $i . ' - ' . $k . '<br>'; 
} 

, czyli

$screen = 1.3; // it can be other decimal value 
    for ($i = 1, $k = 0; $i <= $screen+0.1; $i += 0.1, $k+=25) { 
    echo $i . ' - ' . $k . '<br>'; 
} 

badano. Obie działają ... o ile rozumiem, co chcesz robić.

Testowany Wyjście zarówno:

1 - 0 
1.1 - 25 
1.2 - 50 
1.3 - 75 
+0

dzięki pracy! :) –

0

Masz swoją odpowiedź, to świetnie inny sposób, aby osiągnąć to samo jest w następujący sposób. Source

$start = 1; 
$end = 1.3; 
$place = 1; 

$step = 1/pow(10, $place); 

for($i = $start, $k=0; $i <= $end; $i = round($i + $step, $place), $k += 25) 
{ 
    echo $i . ' - ' . $k . '<br>'; 
}