2002-02-17 20:30 UTC-0300 Walter Negro <anegro@overnet.com.ar>
* source/vm/itemapi.c
! hb_itemStr() - Eliminated the limit of 9 decimals if not SET FIXED ON
! hb_itemStr() - Rounded starting from 17th less significant number.
This is the behavior of Clipper.
Ex:
Before ? str( 1191.63, 20, 15 ) -> 1191.629999999999882
Now ? str( 1191.63, 20, 15 ) -> 1191.630000000000000
This commit is contained in:
@@ -1059,9 +1059,12 @@ char * hb_itemStr( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
|
||||
if( hb_set.HB_SET_FIXED )
|
||||
/* If fixed mode is enabled, always use the default. */
|
||||
iDec = hb_set.HB_SET_DECIMALS;
|
||||
|
||||
/* Otherwise, the maximum is 9. Why? */
|
||||
/*
|
||||
else if( iDec > 9 )
|
||||
/* Otherwise, the maximum is 9. */
|
||||
iDec = 9;
|
||||
*/
|
||||
|
||||
if( pWidth )
|
||||
{
|
||||
@@ -1130,13 +1133,42 @@ char * hb_itemStr( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
|
||||
iBytes = iSize + 1;
|
||||
else
|
||||
{
|
||||
int iDecR;
|
||||
|
||||
if( HB_IS_DOUBLE( pNumber ) && iDec < pNumber->item.asDouble.decimal )
|
||||
dNumber = hb_numRound( dNumber, iDec );
|
||||
|
||||
if( iDec == 0 )
|
||||
iBytes = sprintf( szResult, "%*.0f", iSize, dNumber );
|
||||
if( dNumber != 0.0 )
|
||||
{
|
||||
iDecR = 15 - ( int ) log10( fabs( dNumber ) );
|
||||
if(( dNumber < 1 ) && ( dNumber > -1 )) iDecR++;
|
||||
}
|
||||
else
|
||||
iBytes = sprintf( szResult, "%*.*f", iSize, iDec, dNumber );
|
||||
iDecR = iDec;
|
||||
|
||||
if( iDecR >= 0 )
|
||||
{
|
||||
|
||||
if( iDec == 0 )
|
||||
iBytes = sprintf( szResult, "%*.0f", iSize, dNumber );
|
||||
else
|
||||
{
|
||||
if( iDec <= iDecR )
|
||||
iBytes = sprintf( szResult, "%*.*f", iSize, iDec, dNumber );
|
||||
else
|
||||
{
|
||||
if( iDecR == 0 ) iDecR++;
|
||||
iBytes = sprintf( szResult, "%*.*f%0*u", iSize-iDec+iDecR, iDecR, dNumber, iDec-iDecR, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
|
||||
if( iDec == 0 )
|
||||
iBytes = sprintf( szResult, "%*.0f%0*u", iSize + iDecR , dNumber / pow( 10.0, ( double ) ( -iDecR ) ), -iDecR, 0 );
|
||||
else
|
||||
iBytes = sprintf( szResult, "%*.0f%0*u.%0*u", iSize + iDecR - iDec - 1 , dNumber / pow( 10.0, ( double ) ( -iDecR ) ), -iDecR, 0, iDec, 0 );
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1311,4 +1343,4 @@ PHB_ITEM hb_itemValToStr( PHB_ITEM pItem )
|
||||
hb_xfree( buffer );
|
||||
|
||||
return pResult;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user