Zaokrąglanie double

dzejo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 787
0

Jest jakaś szybka metoda na zaokrąglenie liczby double do wyznaczonej ilości miejsc po przecinku ?
Takie coś może być,czy jest to kaszanka ?:

Kopiuj
//------------------------------------------------------------------------------
double NormalizeDouble(double a, int digits)
{
      for(int i = 0 ; i < digits ; i++)
      {
          a = a*10 ;
      }

      a = (int)a ;

      for(int i = 0 ; i < digits ; i++)
      {
          a = a/10 ;
      }
      return a ;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Imho, nie istnieje niezawodny sposób zaokrąglania.

Kopiuj
 printf("%20.18f",NormalizedDouble(0.1,1)); //0.100000000000000010
hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
inline double round(double what, int precision) {
  double pr = pow(10, precision);
  return static_cast<int>(what*pr+0.5)/pr;
}
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Jesteś pewien?

Kopiuj
printf("%20.18f",round(0.1,1)); //0.000000000000000000
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
long double zaokr(long double d,int n)
  {
   long double p=pow(10.0L,n);
   return floor(d*p+0.5)/p;
  }

dzejo zobacz co ci wypisze:
printf("%20.18f",0.1);

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

A jakim cudem te zaokrąglenia mają działać? Większość liczb ze skończonym rozwinięciem dziesiętnym ma nieskończone rozwinięcie dwójkowe (np. 0.1). Zatem komputer posługuje się jakimś dwójkowym przybliżeniem liczby 0.1, które różni się od 0.1.
U mnie ostatnia propozycja wypisuje
-92559631349317842000000000000000000000000000000000000000000000.000000000000000000
intrygujące.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.