Zaokrąglanie double

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 ?:

//------------------------------------------------------------------------------
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 ;
}
0

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

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

Jesteś pewien?

printf("%20.18f",round(0.1,1)); //0.000000000000000000
0
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);

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1