Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Problem z double i float


Rekomendowane odpowiedzi

Opublikowano

Witam.

Mam mały problem, piszę program który liczby wzory, a wyniki wychodzą dość dokładne (aż za), przez co w liczbie pojawia się 'E-03' (na przykład, potęga 10 do -3). Pytanie jest, jak takiego czegoś się ewentualnie pozbyć, żebym mógł liczbę zaokrąglić?

 

(btw; korzystam z CLI):

double num = 0.32181237812632 //z tym że tutaj przy obliczeniach pojawia się E, bo liczę z wzorów i odczytując wartości z textboxów
double num2 = 1.442131233323523523
double wynik = num * num2;
textbox->Text = Convert::ToString(Math::Round(wynik)); //zwraca 0 bo w liczbie jest E
846331404756772371599.jpeg
Opublikowano

(btw; korzystam z CLI):

CLI is so bad. Ale mniejsza:

 

Problem leży gdzie indziej, prawdopodobnie gdzieś nie dokonujesz konwersji (lub dokonujesz złej).



this.textBox4.Text = Convert.ToString(Convert.ToDouble(textBox2.Text) * Convert.ToDouble(textBox3.Text));

To działa poprawnie (C#). Musisz wstawić więcej kodu.

 

A co do mindsetu "gdzieś w liczbie jest e":

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 

W skrócie:

We float ( czy double ) reprezentacja liczby jako string musi zawierać "e", ponieważ w taki sposób floaty zapisują informację, jako ( mantysa * baza ^ wykładnik ).

Jeśli "gdzieś w liczbie jest e" to znaczy, że starasz się mnożyć dwa stringi, a tego nie możesz robić.

Ta sygnatura jest pusta.

Opublikowano

 //Bizpol

double cbzo = ct0 - Convert::ToDouble(bzl->Text);

double ctpol = (PI * (Convert::ToDouble(D->Text) - Convert::ToDouble(hz->Text))) / Convert::ToDouble(zlob->Text);

double cbzpol = ctpol - Convert::ToDouble(bzl->Text);

double cBizpol = cBiz0*(cbzo / cbzpol);

Bizpol->Text = Convert::ToString(cBizpol);

Przykładowy kod.
846331404756772371599.jpeg
Opublikowano

Od samego początku błędnie rozumujesz problem i tym samym źle dochodzisz jego rozwiązania.

textbox->Text = Convert::ToString(Math::Round(wynik)); //zwraca 0 bo w liczbie jest E
To nie zwraca zera, bo w liczbie jest E. W liczbie nawet nie ma E w formie tekstu. Jest po prostu wykładnik zapisany binarnie (exponent), który po konwersji do stringa w notacji wykładniczej jest przez E oznaczany. Zapis takiej liczby wygląda x*E y czyli x*10^y dla zapisu dziesiątkowego. Opisał to aggression.

Zwraca ci zero, ponieważ przed konwersją tą liczbę zaokrąglasz, a tak się składa, że po zaokrągleniu jest ona równa zero.

Ten temat od samego początku nie ma sensu, bo twoje rozumienie jest błędne i tym samym także pytanie postawione przez ciebie.

 

Przeczytaj to co podał aggression i przemyśl to jeszcze.

Opublikowano

Sopel, zrobiłem to samo w AutoIT i się o tym przekonałem, dosłownie przed chwilą. I muszę ci przyznać rację, zapomniałem że jeśli zaokrąglam do cyfry mniejszej od wykładnika to zawsze wyjdzie 0. Dzięki za pomoc, zamykam.

846331404756772371599.jpeg

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...