none
Floatausgabe auf eine Nachkommastelle begrenzen? RRS feed

  • 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 );

    Mittwoch, 27. Februar 2013 15:44

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
    Donnerstag, 28. Februar 2013 08:20
    Moderator

Alle Antworten

  • Willst Du einen String übergeben oder einen float?

    alternativ:

    float f = 123.245;
    float f2 =((int) (f*10)) / 10;

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 27. Februar 2013 18:09
  • 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
    Donnerstag, 28. Februar 2013 08:20
    Moderator