Stránka 1 z 2
Práce s procenty
Napsal: 16 lis 2018, 10:04
od Axamith
Potřebuji v programu pracovat s procenty.
Mám proměnnou A a povolenou toleranci B. Výpočtem zjistím hodnotu A_min a A_max (Hodnota A + a - procent B).
Kód: Vybrat vše
int A = 100;
int B = 5; // tolerance %
void setup() {
Serial.begin(9600);
}
void loop() {
int A_min = (A - ((A / 100) * B));
int A_max = (A + ((A / 100) * B));
Serial.print("A_min : ");
Serial.println(A_min);
Serial.print("A_max : ");
Serial.println(A_max);
delay(1000);
}
Existuje nějaký elegantnější způsob (funkce), jak pracovat s procenty, než vypisovat kompletní vzorec?
Re: Práce s procenty
Napsal: 16 lis 2018, 14:39
od KamilV
Třeba
Kód: Vybrat vše
int A_min = A-map(B, 0, 100, 0, A);
int A_max = A+map(B, 0, 100, 0, A);
ale nemyslím si, že je to čitelnější a přehlednější konstrukce.
Nejlépe by asi bylo napsat si na to vlastní funkci (ať se ten výpočetní vztah neopakuje v kódu vícekrát) a volat tu.
Re: Práce s procenty
Napsal: 16 lis 2018, 16:26
od martinius96
Vyjadrenie v % môžeš použiť aj ako float číslo.. napríklad pre 5% to bude 1.05

Re: Práce s procenty
Napsal: 16 lis 2018, 17:42
od Axamith
Zůstanu u původního zápisu. Je přehledný a srozumitelný. Nebyl jsem si jistý, jestli není přímo fce na práci s procenty. Žádnou jsem nenašel, ale co kdyby ...
martinius96 píše: ↑16 lis 2018, 16:26
Vyjadrenie v % môžeš použiť aj ako float číslo.. napríklad pre 5% to bude 1.05
Potřebuji mít ty procenta v proměnné, měřím analogovou hodnotu z čidla a výsledku povoluji toleranční pole podmínkou. Pro ladění potřebuji tu % hodnotu měnit.
V každém případě děkuji za názory.
Re: Práce s procenty
Napsal: 16 lis 2018, 18:12
od pavel1tu
Já bych to udělal jako ty ... je to pro mne přehledné
KamilV je evidentně programátor, já na to jeho musel kouknout asi 5x, než jsem to pochopil
Jen pokud to počítáš vícekrát, udělal bych z toho funkci
Re: Práce s procenty
Napsal: 16 lis 2018, 21:46
od AstroMiK
Axamith píše: ↑16 lis 2018, 10:04
Kód: Vybrat vše
int A_min = (A - ((A / 100) * B));
int A_max = (A + ((A / 100) * B));
... A jseš si jistý, že ti ten vzorec funguje?
Zkus si zadat třeba A=80 a B=5. Teoreticky by měl výsledek 76 a 84.
Jenže když nejdřív vydělíš (A/100) to je (80/100), tak výsledek bude v integer rozsahu 0. Pak to můžeš násobit jakýmkoliv B a výsledek další operace bude zase 0.
Re: Práce s procenty
Napsal: 16 lis 2018, 23:29
od SkullKeep
Takže jestli to chápu dobře tak kód by měl vypadat nějak takhle:
Kód: Vybrat vše
int A = 100;
int B = 5; // tolerance %
void setup() {
Serial.begin(9600);
}
void loop() {
int A_min = Amin();
int A_max = Amax();
Serial.print("A_min : ");
Serial.println(A_min);
Serial.print("A_max : ");
Serial.println(A_max);
delay(1000);
}
int Amin () {
return (A - int(float((A / 100)) * B));//výpočet minima
}
int Amax () {
return (A + int(float((A / 100)) * B));//výpočet maxima
}
Re: Práce s procenty
Napsal: 16 lis 2018, 23:48
od AstroMiK
To pořád neřeší ten problém (A/100).
Správně by ten vzorec mohl být třeba takhle:
Kód: Vybrat vše
int A_min = (A - ((A / 100.0) * B));
int A_max = (A + ((A / 100.0) * B));
Lepší by to ale bylo ještě se správným zaokrouhlováním výsledku.
Re: Práce s procenty
Napsal: 19 lis 2018, 08:21
od Axamith
Problém řeším stejně jako je v posledním příspěvku, samotný výpočet je ve funkci. Kód je tak přehlednější.
Jak řešit zaokrouhlování? Já to vyřešil volbou datového typu integer (int). Float by vracel desetinná místa, ale narazil jsem právě na problém zaokrouhlení.
Re: Práce s procenty
Napsal: 19 lis 2018, 09:47
od ohruska
Pokud potřebujete zaokrouhlená procenta, tak by bylo potřeba pracovat s float.
Pro zobrazení potom převod na String, případně zpět na int.
Kód: Vybrat vše
float A_min = (A - ((A / 100.0) * B));
float A_max = (A + ((A / 100.0) * B));
String AA_min=String(A_min,0);
String AA_max=String(A_max,0);
int aaa=AA_min.toInt();
int bbb=AA_max.toInt();
Serial.println(A_min );
Serial.println(A_min,0 );
Serial.println(AA_min );
Serial.println(A_max);
Serial.println(A_max,0 );
Serial.println(AA_max );
Serial.println(aaa);
Serial.println(bbb);