float przycięcie do 2 miejsc po przecinku
camilost
14.03.2016
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 , 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
Asiap
14.03.2016
/** * 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
camilost
16.03.2016
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
grankee
16.03.2016
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
camilost
16.03.2016
Teraz niby kompiluje, ale źle wyświetla wynik, bo wciąż długi, a zamiast 1.85, zwraca mi 2.000000
Puchate
16.03.2016
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
camilost
16.03.2016
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ę.
Puchate
17.03.2016
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
grankee
18.03.2016
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/