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:
Walter Negro
2002-02-18 03:02:58 +00:00
parent 4f0fbc05d4
commit 7c82178214

View File

@@ -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;
}
}