Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zaokrąglanie liczb

Ostatnio zmodyfikowano 2008-01-31 21:15
Autor Wiadomość
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 ?
P-226
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:
C/C++
#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 );
}
P-227
« 1 »
  Strona 1 z 1