Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP błędne obliczenia
Morduk
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.06.2009

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


Witam
Mam następujący problem z PHP. Oblicza mi błędnie działanie.
Skrypt:
  1. <?php
  2. echo 20930898*2+76561197960265728+1;
  3. ?>

Zwraca mi 76561198002127520, mimo iż w rzeczywistości to 76561198002127525.
Jak naprawić ten błąd?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
melior
post
Post #2





Grupa: Zarejestrowani
Postów: 68
Pomógł: 3
Dołączył: 7.12.2009

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


  1. <?php
  2. echo (20930898*2)+76561197960265728+1;
  3. ?>

Dodaj do tego nawias i będziesz miał pewność, że wszystko wykonuje się w odpowiedniej kolejności.
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@Up: Kolejność wykonywania działań ma się w najlepsze w PHP.

Problemem jest wielkość liczb. 76561197960265728 nie może być traktowana jako liczba całkowita ponieważ jest za duża (PHP nie ma typu long, który by pomieścił taką liczbę), a więc jest traktowana jako liczba zmiennoprzecinkowa:
  1. var_dump(76561197960265728); // float(7.65611979603E+16)
Liczby zmiennoprzecinkowe mają natomiast to do siebie, że potrafią utracić część danych (zarówno przy operacjach na dużych liczbach jak i ich części ułamkowej), co skutkuje takim właśnie zachowaniem.

Cytując za manualem:
Cytat
So never trust floating number results to the last digit, and never compare floating point numbers for equality. If higher precision is necessary, the arbitrary precision math functions and gmp functions are available.
http://www.php.net/manual/en/ref.bc.php
http://www.php.net/manual/en/ref.gmp.php


Go to the top of the page
+Quote Post
melior
post
Post #4





Grupa: Zarejestrowani
Postów: 68
Pomógł: 3
Dołączył: 7.12.2009

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


Człowiek uczy się całe życie smile.gif

Jednak czemu w takiej sytuacji nawias rozwiązuje problem, skoro i tak część danych powinna być utracona?
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 - 18:24