Zaokrąglanie liczb
Ostatnio zmodyfikowano 2008-01-31 21:15
Mario Temat założony przez niniejszego użytkownika |
Zaokrąglanie liczb » 2008-01-31 20:52:18 Chcę zaokrąglić liczbę do drugiego miejsca po przecinku, dokładnie chodzi o zaokrąglenie prowizji (zł) do pełnego grosza w górę.
Załóżmy, że chcę zaokrąglić zmienną "prowizja", która aktualnie ma wartość 1,1996 Końcowy wynik zaokrąglenia w tym wypadku powinien = 1.2
Kod : (1) float x=floor(prowizja); (2) float y=prowizja-x; (3) y*=100; (4) ceil(y); (5) y/=100; (6) cout<<x+y;
Teraz krok po kroku obliczam : (1) x = 1 (2) y = 1.1996 - 1 = 0.1996 (3) y = 0.1996 * 100 = 19.96 (4) y = 20 (5) y = 20 / 100 = 0.2 (6) 1.2
W skrócie: zaokrąglam w dół zmienną, później od 1,1996 odejmuje zaokrągloną zmienną, różnicę mnożę razy 100, następnie zaokrąglam ją w górę, dzielę przez 100, na końcu dodaje wynik dzielenia + zmienną zaokrągloną w dół. Powinno wyjść 1.2 ?
U mnie w wyniku wyświetla 1.1996 Czy ktoś wie gdzie popełniłem błąd ? Lub potrafi wytłumaczyć co robie źle i wskazać prawidłową ścieżkę rozwiązania tego problemu ? |
|
DejaVu |
float na double » 2008-01-31 21:15:07 Liczby w komputerze nie są zapisywane tak, jak my sobie to wyobrażamy. Wszystko jest zapisane za pomocą potęgi liczby 2. przykładowo liczba: 00001001.10100000b jest równa: 1*2^3+1*2^0+1*2^(-1)+1*2^(-3)=8+1+0.5+0.125=9.625 Zwiększając dokładność obliczeń (poprzez użycie double zamiast float) wynik Twoich obliczeń będzie dokładniejszy i powinien on rozwiązać Twój problem. Obliczenia na cenie zrobiłbym np. tak: #include <iostream> #include <math.h> #include <conio.h> using namespace std; double ModyfikujCene( double fCena ) { return( floor( fCena * 100 ) / 100.0 ); } int main() { double tCena = ModyfikujCene( 123.3232323 ); cout << tCena << endl; getch(); return( 0 ); }
|
|
« 1 » |