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

float przycięcie do 2 miejsc po przecinku


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

#1 camilost

    ^ BotQ - STER.owiec ^

  • Power User

Reputacja: 434
Wszechobecny

  • Postów:968
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Tychy
Offline

Napisano 14.03.2016 01:32

Potrzebuję, aby liczba zmienno przecinkowa, była max do 2 miejsc po przecinku, nie chodzi mi o wyświetlanie %.2f tylko aby była "0.02" i nic więcej.
Próbowałem:

new Left[4], Right[3]

            split(KillDeaths[i], Left, 3, Right, 2, ".");

ale tag mistmatch


            static stats[8], body[8]

            get_user_stats(i, stats, body)

            KILLS[i] = stats[0]

            DEADS[i] = stats[1]

            KillDeaths[i] = floatdiv(float(stats[0]), float(stats[1]))
// lub nie dzialajace w tym wypadku
//KillDeaths[i] = float(stats[0]/stats[1])

            

            new Left[4], Right[3]

            split(KillDeaths[i], Left, 3, Right, 2, ".");

Plugin sprawdza czy wartość zabić a deadów jest np. wyższa niż 0.50, ale ktos KD ma inne (np. 0.501 a niższe niż 0.51
Sprawdzanie mam:

if ( KillDeaths[id] > 0.450 && KillDeaths[id] <= 0.65)

nastepnie

if ( KillDeaths[id] > 0.650 && KillDeaths[id] <= 0.80)

i sie buguje, bo zalicza np. 0.4501... bym musiał dać > 0.45000000 a to glupota ;P, więc chce aby KillDeaths[id] było do 2 miejsc po przecinku.

Takie zastosowanie jak działa RoundTo na minusie (-2) http://4programmers.net/Delphi/RoundTo


  • +
  • -
  • 0

#2 Asiap

    Wszechpomocny

  • Girl

Reputacja: 171
Profesjonalista

  • Postów:323
  • Lokalizacja:Kętrzyn
Offline

Napisano 14.03.2016 06:07

/**
 * Zwraca liczbe float do X miejsc po przecinku.
 *
 * @param fValue      Liczba float
 * @param iDecimals   Liczba miejsc po przecinku
 */
stock FloatDecimals(Float:fValue, iDecimals = 2)
{
	if(!fValue)
	{
		return 0.0;
	}

	new Float:fPower = float(power(10, iDecimals));
	return floatround(fValue * fPower / fPower);
}

lub

/**
 * Zwraca liczbe float do X miejsc po przecinku.
 *
 * @param fValue      Liczba float
 * @param iDecimals   Liczba miejsc po przecinku
 */
stock FloatDecimals(Float:fValue, iDecimals = 2)
{
	if(!fValue)
	{
		return 0.0;
	}

	new Float:fPower = float(power(10, iDecimals));
	return float(floatround(fValue * fPower, floatround_floor)) / fPower;
}

Użytkownik Asiap edytował ten post 14.03.2016 06:07

  • +
  • -
  • 1

#3 camilost

    ^ BotQ - STER.owiec ^

  • Autor tematu
  • Power User

Reputacja: 434
Wszechobecny

  • Postów:968
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Tychy
Offline

Napisano 16.03.2016 02:38

return 0.0;

tag mismatch
zmieniłem 0,0 ale taki sam błąd przy kompilacji również w:

new Float:KillDeaths[33] //globalna
KillDeaths[i] = floatdiv(float(stats[0]), float(stats[1]))
KillDeaths[i] = FloatDecimals(KillDeaths[i], 2)

a gdy dam

new Float:KillDeaths[33] //globalna
KillDeaths[i] = floatdiv(float(stats[0]), float(stats[1]))
FloatDecimals(KillDeaths[i], 2)

Wynik odsyła 1.853483


  • +
  • -
  • 0

#4 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 16.03.2016 03:36

Myślę, że musisz dodatkowo opleść we floata

new Float:KillDeaths[33] //globalna
KillDeaths[i] = float(floatdiv(float(stats[0]), float(stats[1])))
KillDeaths[i] = float(FloatDecimals(KillDeaths[i], 2))

ponieważ w momencie przypisania do zmiennej killdeaths nie jest wiadomo, że typ będzie zmiennoprzecinkowy.

 

Teraz możesz spokojnie dać

return 0;

bo i tak masz oplecione we floata to co zwrócisz więc będzie śmigało.


Użytkownik grankee edytował ten post 16.03.2016 03:38

  • +
  • -
  • 1

#5 camilost

    ^ BotQ - STER.owiec ^

  • Autor tematu
  • Power User

Reputacja: 434
Wszechobecny

  • Postów:968
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Tychy
Offline

Napisano 16.03.2016 10:31

Teraz niby kompiluje, ale źle wyświetla wynik, bo wciąż długi, a zamiast 1.85, zwraca mi 2.000000


  • +
  • -
  • 0

#6 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 16.03.2016 11:36

 

 

Potrzebuję, aby liczba zmienno przecinkowa, była max do 2 miejsc po przecinku, nie chodzi mi o wyświetlanie %.2f tylko aby była "0.02" i nic więcej.

Chyba nie rozumiesz matematyki i co za tym idzie informatyki. 

Komputer nie będzie operować na zaokrąglonych liczbach, możesz je zaokrąglić tylko do wyświetlenia, ew. zamienić na string.

 

0.50 to (teoretycznie, bo w praktyce nie) 0.5000000000 więc po co chcesz to zaokrąglać do porównywania?

Jeżeli masz błędy związane z porównywaniem liczb to dotknął Cię problem przechowywania liczb zmiennoprzecinkowych.


Użytkownik Puchate edytował ten post 16.03.2016 11:39

  • +
  • -
  • 0

#7 camilost

    ^ BotQ - STER.owiec ^

  • Autor tematu
  • Power User

Reputacja: 434
Wszechobecny

  • Postów:968
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Tychy
Offline

Napisano 16.03.2016 11:58

Nie chce zaokrąglić do pełnej, a do 2ch po przecinku (uciąć Float po 2 przecinkach 1.75-ciach resztę...)
Ewentualnie, aby po 2 przecinkach były zera. tj. 1.34(0) takie coś, a nie 1.00 jak mam 1.34516112131 (jak działają pow. funkcje).

PS. Przetestuj powyższe funkcję i wtedy sobie jeździj po innych, bo niczym nie pomogłeś. Zaokrąglają pow. funkcje do liczby przed przecinkiem. :)
Trzymałem się zawsze twierdzenia, nie pomogę w żaden sposób, to po co się odzywać. I bez spin. Czekam na propozycję.


  • +
  • -
  • 0

#8 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 204
Profesjonalista

  • Postów:433
  • Lokalizacja:Polska
Offline

Napisano 17.03.2016 11:47


 

 

Ewentualnie, aby po 2 przecinkach były zera. tj. 1.34(0) takie coś, a nie 1.00 jak mam 1.34516112131 (jak działają pow. funkcje).

Tego się nie da zrobić. To jest ten problem z przechowywaniem liczb zmiennoprzecinkowych o którym pisałem wyżej.

Te funkcje niczego nie zaokrąglają, bo nie da się trzymać zaokrąglonych liczb w pamięci. Można je zaokrąglić przy wyświetleniu.

 

1.50 to nic innego jak 1.5000000, lecz przy przechowywaniu ta liczba się "psuje" i zmienia swoją wartość.

Pomnóż te liczby i pozbądź się floatów na rzecz intów przy porównywaniu. Wartości typu float są wartościami przybliżonymi i nie powinno się ich porównywać gdy liczy się precyzja. Float to tylko 4 bajty, a nie mamy dostępu do double.

 

Nikt tutaj się nie spina tylko Ty wciąż nie rozumiesz sposobu zapisywania liczb zmiennoprzecinkowych w pamięci komputera. To nie jest takie łatwe. Podstawy działania komputera się kłaniają. Zamiast się oburzać to wpisz sobie w google np. "zmienna float dokładność" i poczytaj o tym. Przykładowa strona z informacjami.


Użytkownik Puchate edytował ten post 17.03.2016 12:10

  • +
  • -
  • 1

#9 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 18.03.2016 03:34

camilost powiem Ci cos waznego, jesli chodzi o programowanie. Jestem  jednym z ludzi, którzy napsuli sobie hektolitry krwi, żeby się czegoś nauczyć i spędziłem wieki na googlach i trułem d*pę wielu osobom, żeby mi pomogli. Jesterm akurat z tych, co wolą pytać niż używać pseudoporadników, z których w większości przypadków mało wynika.

Mój 'problem' (czyli to co napsuło mi nerwów) z nauką polega na tym, że nie potrafię zaakceptować pojęcia "bo tak już jest i zapamiętaj", ja muszę zrozumieć. Dążenie do zrozumienia w matematyce, informatyce, fizyce i ogólnie naukach ścisłych to klucz do sukcesu. Jednak nie o mnie ten topic więc przejdę do sedna.

 

1.Jeśli czegoś nie wiesz to pytaj, od tego jest to forum. -to akurat zrobiłeś.

2.jeśli nie rozumiesz odpowiedzi, albo nie rozumiesz czemu tak a nie inaczej to pytaj dalej.

3.powtarzaj punkt 2 aż do rozwiązania problemu.

 

Nie denerwuj się tylko dlatego, że udzielona odpowiedź jest niezrozumiała dla Ciebie. Osoba odpowiadająca na Twój problem nie wie na ile Twoja wiedza pozwala Ci zrozumieć temat, dlatego ważne jest powtarzanie punktu 2.


PS. Przetestuj powyższe funkcję i wtedy sobie jeździj po innych...

 

Nie dostrzegam 'jeżdżenia' po Tobie.


...bo niczym nie pomogłeś.


0.50 to (teoretycznie, bo w praktyce nie) 0.5000000000 więc po co chcesz to zaokrąglać do porównywania?
Jeżeli masz błędy związane z porównywaniem liczb to dotknął Cię problem przechowywania liczb zmiennoprzecinkowych.

Myślę, że te informacje były bardzo pomocne, a przez Ciebie zignorowane. Seba to akurat gość, który wie co mówi i siedzi w tym nie od wczoraj. Wiele razy mi pomagał parę lat temu. Zrelaksuj się, weź kilka wdechów i podejdź do tematu ze świadomością, że go nie rozumiesz, ale bardzo chcesz zrozumieć. Pozdrawiam.

 

 

PS. żeby nie było, że offtopa robię.

 

Jeśli chcesz do dwóch miejsc po przecinku to pomnóż sobie przez 100 te liczby i zaokrąglij ucinając w ogóle to co jest po przecinku i na takich całkowitych liczbach operuj. Potem do wyświetlania używaj ich jako floatów (podziel te liczby na 100 i wyswietl z zaokrągleniem do dwóch miejsc używając %.2f. Więcej o tym też już ktoś ogarnięty napisał http://amxx.pl/topic...aty-i-ich-wady/


  • +
  • -
  • 1

#10 camilost

    ^ BotQ - STER.owiec ^

  • Autor tematu
  • Power User

Reputacja: 434
Wszechobecny

  • Postów:968
  • GG:
  • Steam:steam
  • Imię:Kamil
  • Lokalizacja:Tychy
Offline

Napisano 28.03.2016 08:13

Dzięki :D Można zamknąć, poradziłem sobie :) + poszły :) Dzięki za pomoc :)


  • +
  • -
  • 0




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

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