![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 516 Pomógł: 1 Dołączył: 25.08.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam dziwny przypadek..... Podczas zapisu danych do tabeli MySQL przeliczam wartość faktury. Przeliczanie wartości jest proste, bowiem polega na przemnożeniu ilości przez cenę (wyliczenie wartości brutto)
po zapisie danych pojawia mi się różnica jednego grosza, konkretnie działanie wygląda tak 50 x 2,1 = 105,01 jakieś pomysły? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 243 Pomógł: 22 Dołączył: 1.06.2009 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Zaokrąglanie:
ceil() góra floor() dół |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 11 Dołączył: 25.07.2012 Ostrzeżenie: (0%) ![]() ![]() |
Prawdopodobnie w bazie danych korzystasz z pola typu float. Float ma to do siebie, że nie jest w stanie obsłużyć liczb nieskończych, i zaokrągla je. Niby przy prostych operacjach jest to prawie nieodczuwalne, ale jeśli taka liczba zostanie później pomnożona x100000 to różnica jest znaczna. Do zapisu cen/walut/ etc, wykorzystuje typ pola DECIMAL(11,2) i nie mam problemów, bo zapisuje dokładnie taką wartość jaką trzeba (bez zaokrąglania po tysięcznych częściach).
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 516 Pomógł: 1 Dołączył: 25.08.2012 Ostrzeżenie: (0%) ![]() ![]() |
Prawdopodobnie w bazie danych korzystasz z pola typu float. Float ma to do siebie, że nie jest w stanie obsłużyć liczb nieskończych, i zaokrągla je. Niby przy prostych operacjach jest to prawie nieodczuwalne, ale jeśli taka liczba zostanie później pomnożona x100000 to różnica jest znaczna. Do zapisu cen/walut/ etc, wykorzystuje typ pola DECIMAL(11,2) i nie mam problemów, bo zapisuje dokładnie taką wartość jaką trzeba (bez zaokrąglania po tysięcznych częściach). hmmmmm, u mnie w bazie jest typ pola Decimal(6,2), to co piszesz jest o i nie ma tu dyskusji, ale przy iloczynie 50 x 2,1 nie ma części setnych a jednak tak mi to do bazy pakuje |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 9 Dołączył: 3.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
jakieś pomysły? 1. Ponieważ to faktury to radzę przeczytać o zaokrąglaniu groszy wg ustawy 2. To co mi doradzono - działania finansowe robić na intach, a jedynie na wejsciu i na wyjściu dodawać/odejmować przecinki. Inaczej licząc na floatach robią się takie kwiatuszki jak pojawiające się lub znikające grosze. A tą metoda to w bazie masz INT, w php liczysz na INT, a jedynie musisz mieć dwie funkcje: a.) zamieniającą dane zewnętrzne na INT b.) zamieniającą daną INt typu xyzy na string xy.zy EDIT: 3. Ponieważ to faktury to radzę zwrócić uwagę na liczenie vat "od netto" i "od brutto" i nie pomieszać tego ![]() Ten post edytował skleps 7.01.2013, 19:00:35 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 6.07.2025 - 16:17 |