Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Problem z floatem


Najlepsza odpowiedź GwynBleidD , 12.08.2014 09:58

Po kie grzyba Ci tu operacje zmiennoprzecinkowe? Przecież przecinek masz w stałym miejscu...

Przechowuj ceny jako liczbę groszy i wyświetlaj je tak:
 

format(aaa, charsmax(aaa), "%d.%02d", grosze/100, grosze%100)
Nie ma co się pchać w floaty tam, gdzie potrzebne nie są smile.png Jeśli przecinek jest zawsze w stałym miejscu, można to obejść. Przejdź do postu


  • Zamknięty Temat jest zamknięty
8 odpowiedzi w tym temacie

#1 SeeK

    Wszechobecny

  • Użytkownik

Reputacja: 192
Profesjonalista

  • Postów:438
Offline

Napisano 11.08.2014 14:59

Wie ktoś może, dlaczego poniższe dwie linijki zwracają mi w logach 24.999999 zamiast 25.000000?

log_amx("%f",25*1.0)

log_amx("%f",float(25))

Dodam, że dzieje się to na serwerze postawionym na linuxie, na lokalnym serwerze na Windzie wszystko działa prawidłowo.


  • +
  • -
  • 0
https://sklep-sms.pl - Sklep SMS pozwala zarabiać na swoich serwerach gier opartych o silniki AMX Mod X oraz SOURCEMOD
https://nalunch.com - A Ty, gdzie pójdziesz dziś na lunch?

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 984
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 11.08.2014 15:00

Operacje na typach zmiennoprzecinkowych mogą być niedokładne ;)


  • +
  • -
  • 0

#3 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 984
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 11.08.2014 15:19

Oraz rzutowanie int na float także.

 

możesz dodać używanie floatround


  • +
  • -
  • 0

#4 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 11.08.2014 23:02

Problem wygląda tak...

W systemie dziesiętnym, gdy podzielisz 1 przez 3 otrzymujesz 0,(3) czyli nieskończoną liczbę trójek. W systemie trójkowym by było to po prostu 0.1... To jest ograniczenie zapisu dziesiętnego...

Komputer jednak myśli dwójkowo, ten zapis również ma swoje wady i czasem powstaje w nim potrzeba zapisania nieskończonej ilości cyfr po przecinku, a się przecież nie da... Więc w pewnym momencie cyfry zostają ucięte, co daje niedokładny wynik.
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#5 SeeK

    Wszechobecny

  • Autor tematu
  • Użytkownik

Reputacja: 192
Profesjonalista

  • Postów:438
Offline

Napisano 12.08.2014 00:27

Czyli wychodzi na to, że nie jestem w stanie zrzutować liczby 25 na float tak, aby było to 25.000000? Dziwne jest to, że na na serwerze postawionym na windowsie wszystko działa prawidłowo, problem jest tylko z serwerami postawionymi na linuxie, a dokładniej debianie :/

 

Kurcze w żadnym języku programowania nie ma takich problemów tylko w PAWN są :P Ma ktoś jakiś pomysł jak ten problem naprawić? Może zarysuję sytuację. Mam bazę danych z cenami różnych przedmiotów, mogą one przyjmować wartość zmiennoprzecinkową. No i teraz, gdy wyświetlam graczowi ceny, to nie wyświetla się ITEM 1 - Koszt 19.00 tylko ITEM 1 - Koszt 18.99 Ceny mnożę przez podatek VAT, dlatego też nie mogę ich przechowywać jako tekst. W ostateczności tak zrobię i zaimplementuję własną arytmetykę na stringach, ale wolałbym tego uniknąć :)


Użytkownik SeeK edytował ten post 12.08.2014 00:28

  • +
  • -
  • 0
https://sklep-sms.pl - Sklep SMS pozwala zarabiać na swoich serwerach gier opartych o silniki AMX Mod X oraz SOURCEMOD
https://nalunch.com - A Ty, gdzie pójdziesz dziś na lunch?

#6 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 12.08.2014 01:54

Z floatem to raczej w każdym języku jest taki problem. Można to rozwiązać poprzez zwykłe dodanie małej liczby i wyświetlanie o jedno zero mniej, albo też taka funkcja chyba będzie już zamieniać liczbę na dobrą
stock Float:new_float(Float:number) {
	new sTxt[32];
	formatex(sTxt, 31, "%.5f", number+0.000001);
	return str_to_float(sTxt);
}

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#7 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 12.08.2014 09:58   Najlepsza odpowiedź

Po kie grzyba Ci tu operacje zmiennoprzecinkowe? Przecież przecinek masz w stałym miejscu...

Przechowuj ceny jako liczbę groszy i wyświetlaj je tak:
 
format(aaa, charsmax(aaa), "%d.%02d", grosze/100, grosze%100)
Nie ma co się pchać w floaty tam, gdzie potrzebne nie są smile.png Jeśli przecinek jest zawsze w stałym miejscu, można to obejść.
  • +
  • -
  • 1

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#8 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 984
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 12.08.2014 10:11

Kurcze w żadnym języku programowania nie ma takich problemów tylko w PAWN są

 

W każdym języku liczby zmiennoprzecinkowe są problematyczne ;)


  • +
  • -
  • 0

#9 SeeK

    Wszechobecny

  • Autor tematu
  • Użytkownik

Reputacja: 192
Profesjonalista

  • Postów:438
Offline

Napisano 12.08.2014 11:20

Po kie grzyba Ci tu operacje zmiennoprzecinkowe? Przecież przecinek masz w stałym miejscu...

Przechowuj ceny jako liczbę groszy i wyświetlaj je tak:
 

format(aaa, charsmax(aaa), "%d.%02d", grosze/100, grosze%100)
Nie ma co się pchać w floaty tam, gdzie potrzebne nie są smile.png Jeśli przecinek jest zawsze w stałym miejscu, można to obejść.

 

 

Nie pomyślałem o takim rozwiązaniu  ;> Można zamknąć :)


  • +
  • -
  • 0
https://sklep-sms.pl - Sklep SMS pozwala zarabiać na swoich serwerach gier opartych o silniki AMX Mod X oraz SOURCEMOD
https://nalunch.com - A Ty, gdzie pójdziesz dziś na lunch?




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych