Benutzer mit den meisten Antworten
Floatausgabe auf eine Nachkommastelle begrenzen?

Frage
-
Hi,
meine C++ Zeit liegt war im letzten Jahrtausend ....
Ich füttere eine Stored Procedure und möchte die Ausgabe auf eine Nachkommastelle begrenzen. (Code siehe unten)
Kann mir jemand helfen?
Danke Michael
// GewichtAllerPackungen -- zges_g -- Float !!! / 1000 !!!
p09 = pCom->CreateParameter(_bstr_t(L""), adCurrency, adParamInput, 8, _variant_t( (long) 5) );
p09->Value = _variant_t( (float) (StatistikDatenExtern[StatistikPtr].GewichtDerPackungenInGewichtsKlasse[1] / 1000) );
pCom->Parameters->Append( p09 );
Antworten
-
Hi Jochen! So geht es nicht. Du musst wieder einen float ins Spiel bringen sonst bleibt es bei int Arithmetik.
float f2 =((int) (f*10)) / 10.0;
Diese Arithmetik ist evtl. auch problematisch wegen einem Überlauf.
Ich habe folgende Funktion dafür:
double RoundDouble(double dVal, int iPrec) { // Need a default? if (iPrec==-1) iPrec = CLocale::Instance().m_iDigits; // Need rounding? if (iPrec<0) return dVal; // Shift double dShift=1.0; for (int i=0; i<iPrec; ++i) dShift *= 10.0; // multiply and split (get integral Part) double dResult, dFrac; if (fabs(dFrac=modf(dVal*dShift,&dResult))>=0.5) // Check sign and round dResult += dFrac<0.0 ? -1.0:1.0; // Shift it back return dResult/dShift; }
CLocale::Instance().m_iDigits ist die Standardeinstellung des Windows Systems und eine spezielle Helferklasse die ich benutze.Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort markiert mimuel Donnerstag, 28. Februar 2013 09:36
Alle Antworten
-
Hi Jochen! So geht es nicht. Du musst wieder einen float ins Spiel bringen sonst bleibt es bei int Arithmetik.
float f2 =((int) (f*10)) / 10.0;
Diese Arithmetik ist evtl. auch problematisch wegen einem Überlauf.
Ich habe folgende Funktion dafür:
double RoundDouble(double dVal, int iPrec) { // Need a default? if (iPrec==-1) iPrec = CLocale::Instance().m_iDigits; // Need rounding? if (iPrec<0) return dVal; // Shift double dShift=1.0; for (int i=0; i<iPrec; ++i) dShift *= 10.0; // multiply and split (get integral Part) double dResult, dFrac; if (fabs(dFrac=modf(dVal*dShift,&dResult))>=0.5) // Check sign and round dResult += dFrac<0.0 ? -1.0:1.0; // Shift it back return dResult/dShift; }
CLocale::Instance().m_iDigits ist die Standardeinstellung des Windows Systems und eine spezielle Helferklasse die ich benutze.Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
- Als Antwort markiert mimuel Donnerstag, 28. Februar 2013 09:36