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

Problem z float


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 10.08.2020 21:29

Kod:

new const Float:fNumbers[] = { 1.27, 6.33, 11.07 };
client_print(id, "Liczba: %.2f", fNumbers[0]);
client_print(id, "Liczba: %.2f", fNumbers[1]);
client_print(id, "Liczba: %.2f", fNumbers[2]);

Rezultat:

Liczba: 11.06

Można coś z tym zrobić ? Raczej ciężko byłoby żebym teraz zamiast liczb zmiennoprzecinkowych użył całkowitych.


  • +
  • -
  • 0

#2 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 10.08.2020 22:10

unikać floatów, zamiast tego trzymać inty, i wyświetlać w wlasny sposób. Naprawdę, używanie floatów jako np Euro (ogólnie waluta) to w pewnym stopniu proszenie się o kłopoty.

 

https://amxx.pl/topi...aty-i-ich-wady/

 

 

Jako taki trick możesz dodać np. 0.000001 do liczby i to powinno przeważyć na strone 11.07

 

Co do konwersji na inty, kurde, mamy fmt(), które jest fajne, szybko można przerobić wszystko

Ubrać to w funkcje i refactoring leci:

new val = 1107;
log_amx("%s", fmt("%d.%02d", val / 100, val % 100));

Rivit (10.08.2020 22:11):
Nie wiem czy wiesz jak floaty działają 'pod spodem', ale są takie liczby, których nie da się dokładnie reprezentować jako float, wynika to z przyjętego standardu kodowania liczb zmiennoprzecinkowych

  • +
  • -
  • 0

#3 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 11.08.2020 02:12


unikać floatów, zamiast tego trzymać inty, i wyświetlać w wlasny sposób. Naprawdę, używanie floatów jako np Euro (ogólnie waluta) to w pewnym stopniu proszenie się o kłopoty.

Tak jak powiedziałem raczej nie ma opcji żebym tutaj używał liczb całkowitych. Kod ma ponad 10k linijek a zmienne z liczbami float są używane dość często. Zamienie to na int jeśli naprawdę będzie to konieczne.

 


Co do konwersji na inty, kurde, mamy fmt(), które jest fajne, szybko można przerobić wszystko

fmt() nie działa na amxx <1.8.3. Na 1.8.3 akurat nie pamiętam czy to działało. Ale jako że nie zawsze mogę używać silnika rehlds do testowania pluginów to instaluje amxx 1.8.2 gdzie fmt() nie ma.

 

Jutro sprawdzę czy dodawanie 10^-6 do liczby zadziała. Dzisiaj o 3 w nocy tylko coś niepotrzebnie popsuje.


  • +
  • -
  • 0

#4 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 11.08.2020 09:31


Tak jak powiedziałem raczej nie ma opcji żebym tutaj używał liczb całkowitych

 

No jak chcesz, ja wszystko co miałem to przerobiłem na inty, zero problemów z jakimiś dziwnymi przypadkami kupowania za mniej niż się ma etc etc.

 

 


fmt() nie działa na amxx <1.8.3. Na 1.8.3 akurat nie pamiętam czy to działało. Ale jako że nie zawsze mogę używać silnika rehlds do testowania pluginów to instaluje amxx 1.8.2 gdzie fmt() nie ma.

fmt() można zastąpić prostą funkcją, która zwraca sformatowany bufor.

 

 


Jutro sprawdzę czy dodawanie 10^-6 do liczby zadziała.

Nie wiem czy to będzie działać w 100% przypadkach, możliwe że kiedys nagnie się w tą drugą stronę :D i będzie za dużo.

 

 


Dzisiaj o 3 w nocy tylko coś niepotrzebnie popsuje.

Polecam nie testować na produkcji ;)

 


  • +
  • -
  • 0

#5 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 11.08.2020 10:30


No jak chcesz, ja wszystko co miałem to przerobiłem na inty, zero problemów z jakimiś dziwnymi przypadkami kupowania za mniej niż się ma etc etc.

Rozumiem ale ciężko byłoby mi teraz wszystko zamienić na int. W kodzie jest mnóstwo porównań i działań które z liczbami całkowitymi wyglądałyby całkiem inaczej.

 


Nie wiem czy to będzie działać w 100% przypadkach, możliwe że kiedys nagnie się w tą drugą stronę :D i będzie za dużo.

Zarówno na liczbie która wyświetlała się prawidłowo jak i na tej która była za mała teraz wszystkie wyświetlają się prawidłowo. O ile mam racje jeśli liczba jest w %f 11.069999 i w %.2f wyświetla się 11.06 to jakbym niepotrzebnie dodał te 0.000001 i byłoby np. 1.000001 to też zaokrągliło by się to do 1.0.

Z tym że nie wiem czy też muszę to dodawać przy innych obliczeniach. Operatory porównywania działają poprawnie z tymi liczbami, ale już wiadomości na chat'cie czy hud nie działały dobrze.

 


fmt() można zastąpić prostą funkcją, która zwraca sformatowany bufor.

Może kiedyś wykorzystam, ale jeśli pozostałe obliczenia na float'ach działają bez tego błędu to mógłbym sformułować to inaczej i wykorzystać liczbę zmiennoprzecinkową oraz floatfract().


  • +
  • -
  • 0




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

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