Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Dziwny problem z odejmowaniem
azalol
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.01.2011

Ostrzeżenie: (0%)
-----


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ą.

Ten post edytował azalol 8.01.2011, 20:36:40
Go to the top of the page
+Quote Post
Wicepsik
post
Post #2





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


round


--------------------
Go to the top of the page
+Quote Post
azalol
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.01.2011

Ostrzeżenie: (0%)
-----


Próbowałem już z round we wszystkich sensownych miejscach i wszystkimi sensownymi sposobami, niestety bezskutecznie.
Go to the top of the page
+Quote Post
cycofiasz
post
Post #4





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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?

Ten post edytował cycofiasz 8.01.2011, 20:55:30
Go to the top of the page
+Quote Post
Wicepsik
post
Post #5





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


sprintf?


--------------------
Go to the top of the page
+Quote Post
azalol
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.01.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
smietek
post
Post #7





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


Spróbuj

  1. sprintf('%0.10f', $Zmienna_przyblizajaca_sie);


--------------------
Go to the top of the page
+Quote Post
azalol
post
Post #8





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.01.2011

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował azalol 8.01.2011, 20:45:00
Go to the top of the page
+Quote Post
cycofiasz
post
Post #9





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Zrób tak:
  1. $dasd= 3- (float) $data['lat'];
Go to the top of the page
+Quote Post
azalol
post
Post #10





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.01.2011

Ostrzeżenie: (0%)
-----


Działa! Wielkie dzięki dla pana cycofiasza.
Go to the top of the page
+Quote Post
thek
post
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 08:05