Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP/MYSQL - Duże liczby same zaokrąglają się przy zapisie
Forum PHP.pl > Forum > PHP
nastalski
Witam, mam problem przy zapisywaniu dużych liczb do bazy danych (np. 195783408252549). Same się zaokrąglają. Na tym przykładzie w bazie ląduje mi 195783408252550). Czy ktoś kiedyś spotkał się z takim problemem? Typ w bazie to bigint.


  1. $kasa2 = $_POST['cash']*1;
  2. $nowyhajs = $kasa-$kasa2;
  3. mysql_query("UPDATE `users` SET `lokata`='1', `lokatakasa`='$kasa2', `kasa_usd`='$nowyhajs' WHERE `id`='$c_id'");


Po sprawdzeniu skryptu, okazuje się, że liczby powyżej 100 000 000 000 000 się zaokrąglają. Liczby mniejsze są w porządku. Jakieś pomysły?
vermis
1. Sprawdź zapytanie bezpośrednio w bazie, będziesz wiedział, czy to problem bazy czy po stronie php.
2. Sprawdź co rzeczywiście wstawiasz do zapytania. Możliwe że problem leży w obliczeniach w php. Jeśli liczby są zmiennoprzcinkowe to mogą wystąpić problemy z zaokągleniami.
markonix
Tak z ciekawości, jak to możliwe że identyfikatory (domyślam się że autoincrement) doszły do biliardowych liczb?

Drugie pytanie to co za zadanie ma pierwsza linijka czyli mnożenie czegoś przez 1?
timon27
Cytat(markonix @ 5.12.2013, 11:45:03 ) *
Drugie pytanie to co za zadanie ma pierwsza linijka czyli mnożenie czegoś przez 1?


Zmiana typu zmiennej. Przykład:
  1. echo '4 koteczki' * 1;

wyświetli 4.

No najważniejsze: jakiego typu jest kasa_usd?
Bo może jest typu int(24).
U mnie domyślnie w phpmyadmin tworzy się int(11) !
Więc liczby powyżej 100 000 000 000 się już zaokrąglają.
nastalski
Cytat
1. Sprawdź zapytanie bezpośrednio w bazie, będziesz wiedział, czy to problem bazy czy po stronie php.

Jeśli wykonuję zapytanie bezpośrednio w bazie to wszystko jest w porządku.

Cytat
2. Sprawdź co rzeczywiście wstawiasz do zapytania. Możliwe że problem leży w obliczeniach w php. Jeśli liczby są zmiennoprzcinkowe to mogą wystąpić problemy z zaokągleniami.

Liczby nie są zmiennoprzecinkowe.

Cytat
Tak z ciekawości, jak to możliwe że identyfikatory (domyślam się że autoincrement) doszły do biliardowych liczb?

To nie są identyfikatory, nie jest to też A-I.

Cytat
No najważniejsze: jakiego typu jest kasa_usd?

Typ ustawiony w bazie na bigint(20)
Damonsson
  1. var_dump($nowyhajs);


^ pewnie pokaże Ci już przekłamaną.

PHP się gubi przy dużych liczbach, musisz zamienić to na string, albo poczytaj o jakichś bibliotekach które precyzują liczby.
nastalski
@up
Dzięki, zainteresuję się takimi bibliotekami.

Funkcja var_dump zwraca
Kod
float(1.0E+14)
vermis
Cytat(nastalski @ 5.12.2013, 21:25:39 ) *
Funkcja var_dump zwraca
Kod
float(1.0E+14)


Czyli jednak zmiennoprzecinkowa smile.gif
nospor
@vermis dostales FLOAT bo masz zapis 1.0E+14
A masz taki zapis, bo php nie radzi sobie juz z tak dużą liczbą....
Pyton_000
Zainteresuj się tym:
http://www.php.net/manual/en/ref.gmp.php

ew. spróbuj zapisaną liczbę jako string rzutować na (float)
markonix
Cytat(timon27 @ 5.12.2013, 15:42:18 ) *
Zmiana typu zmiennej. Przykład:
  1. echo '4 koteczki' * 1;

wyświetli 4.

To też się domyśliłem ale po pierwsze bardziej czytelne jest użycie rzutowania (int), po drugie w tym konkretnym przykładzie rzutowanie i tak w kolejnej linijce wystąpi samoistnie ze względu na użycie zmiennej w działaniu.
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.