Práce s procenty

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Práce s procenty

Příspěvek od Axamith » 16 lis 2018, 10:04

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?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Práce s procenty

Příspěvek od KamilV » 16 lis 2018, 14:39

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.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Práce s procenty

Příspěvek od martinius96 » 16 lis 2018, 16:26

Vyjadrenie v % môžeš použiť aj ako float číslo.. napríklad pre 5% to bude 1.05 :)

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Práce s procenty

Příspěvek od Axamith » 16 lis 2018, 17:42

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.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Práce s procenty

Příspěvek od pavel1tu » 16 lis 2018, 18:12

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Práce s procenty

Příspěvek od AstroMiK » 16 lis 2018, 21:46

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.

Uživatelský avatar
SkullKeep
Příspěvky: 290
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Práce s procenty

Příspěvek od SkullKeep » 16 lis 2018, 23:29

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
}
:twisted: :?: :arrow: :geek: P. Q. M.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Práce s procenty

Příspěvek od AstroMiK » 16 lis 2018, 23:48

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.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Práce s procenty

Příspěvek od Axamith » 19 lis 2018, 08:21

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í.

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Práce s procenty

Příspěvek od ohruska » 19 lis 2018, 09:47

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);

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 20 hostů