Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dziwny problem z odejmowaniem
Forum PHP.pl > Forum > Przedszkole
azalol
Otóż, mam skrypt który wygląda tak:
  1. <?php
  2. $xml = simplexml_load_file('2010.xml');
  3. foreach ($xml->trk->trkseg->trkpt as $data)
  4. {
  5. $dasd= 3-$data['lat'];
  6. echo $n . ".<br />";
  7. echo "Wysokość:" . $data->ele . "<br />";
  8. echo "Szerokość geograficzna:" . $data['lat'] . "<br />";
  9. echo "Długość geograficzna:" . $data['lon'] . "<br />";
  10. echo "Data:" . $data->time . "<br />";
  11. echo $dasd . "<br />";
  12. $n++;
  13. }
  14. ?>

Pobiera on dane z pliku xml:
  1. <?xml version="1.0" encoding="utf-8"?><gpx version="1.0" creator="SportyPal" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
  2. <trk>
  3. <name>SportyPalTrack</name>
  4. <desc>The track description</desc>
  5. <trkseg>
  6. <trkpt lat="52.26737256" lon="5.61004397">
  7. <ele>0</ele>
  8. <time>2135-11-26T04:46:18Z</time>
  9. </trkpt>
  10. <trkpt lat="52.26736105" lon="5.61003357">
  11. <ele>0</ele>
  12. <time>2135-11-26T04:46:23Z</time>
  13. </trkpt>
  14. <trkpt lat="52.26735853" lon="5.61003708">
  15. <ele>0</ele>
  16. <time>2135-11-26T04:46:27Z</time>
  17. </trkpt>
  18. </trkseg>
  19. </trk>
  20. </gpx>

Wszystko działa pięknie i ładnie oprócz odejmowania (zmienna $dasd w skrypcie, wynik jest zaokrąglany do całości podczas gdy ja potrzebuję go z jak największą dokładnością. Byłbym wdzięczny jeśli ktoś mógłby mnie oświecić w jaki sposób zmusić PHP do większego posłuszeństwa w tej kwestii?


EDIT
teraz zauważyłem że nie jest to do końca zaokrąglenie - przy odjęciu od trzech 54.971205 powinno wyjść raczej -52 podczas gdy rezultatem jest 51, czyli wygląda na to że coś zjada przecinki.

http://azalol.cba.pl/test.php
tutaj widać o co mi chodzi, po zastosowaniu funkcji printf('%0.10f', $dasd); skrypt zwraca wartość odejmowania -51.0000000000 co jest niezgodne z prawdą.
Wicepsik
round
azalol
Próbowałem już z round we wszystkich sensownych miejscach i wszystkimi sensownymi sposobami, niestety bezskutecznie.
cycofiasz
Po poprawieniu xmla i odpaleniu tego kodu u siebie, wyświetlają sie prawidłowe liczby EDIT: jednak źle spojrzałem winksmiley.jpg

Zrób może print_r($xml) i sprawdź czy na tym etapie liczby są jeszcze poprawne. Używasz może wcześniej setlocale?
Wicepsik
sprintf?
azalol
Nie używałem wcześniej setlocale.
Liczby są poprawne przez cały czas (łącznie z print_r($xml)), jedynie przy odejmowaniu widac jakieś dziwne zaokrąglenie.
smietek
Spróbuj

  1. sprintf('%0.10f', $Zmienna_przyblizajaca_sie);
azalol
@smietek
Daje wynik -51.0000000000
Byłbym wdzięczny jeśli ktoś mógłby sprawdzić wynik odejmowania u siebie (coś mi świta z TI że zaokrąglenia mogą być różne zależnie od konfiguracji serwera, nic u siebie nie grzebałem, ale kto wie czy jakiś współlokator nie bawił się moim kosztem).
http://azalol.cba.pl/test.php oto jak to wygląda ;/
Edit
Manualnie odejmując w PHP 3-54.970918 otrzymuję dobry wynik, jest to dla mnie bardzo dziwne.
cycofiasz
Zrób tak:
  1. $dasd= 3- (float) $data['lat'];
azalol
Działa! Wielkie dzięki dla pana cycofiasza.
thek
Może problemem jest to, że php gdzieś po drodze rzutuje 54.970918 na int... Wtedy miałbyś 3-54 (obetnie część ułamkową). Spróbuj na pałę wymusić rzutowanie do double lub float.

EDIT: Jak widzę chwilka spóźnienia winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.