fix rounding error in displaying percent score

This commit is contained in:
Chris Danford
2004-10-18 03:00:12 +00:00
parent 791fe80ef9
commit 0634c55431
4 changed files with 21 additions and 9 deletions
+12 -6
View File
@@ -71,7 +71,11 @@ void PercentageDisplay::Refresh()
m_Last = iActualDancePoints;
CString sNumToDisplay;
if( !PREFSMAN->m_bDancePointsForOni )
if( PREFSMAN->m_bDancePointsForOni )
{
sNumToDisplay = ssprintf( "%*d", DANCE_POINT_DIGITS, max( 0, iActualDancePoints ) );
}
else
{
float fPercentDancePoints = m_pSource->GetPercentDancePoints( m_PlayerNumber );
@@ -86,16 +90,18 @@ void PercentageDisplay::Refresh()
m_textPercentRemainder.SetText( ssprintf(".%01d%%", iPercentRemainder) );
}
else
{
float fNumToDisplay = fPercentDancePoints*100;
sNumToDisplay = ssprintf( "%*.*f%%", PERCENT_TOTAL_SIZE, PERCENT_DECIMAL_PLACES, fNumToDisplay );
{
// TRICKY: printf will round, but we want to truncate. Otherwise, we may display a percent
// score that's too high and doesn't match up with the calculated grade.
float fTruncInterval = powf(0.1f,PERCENT_TOTAL_SIZE);
fPercentDancePoints = ftruncf( fPercentDancePoints, fTruncInterval );
sNumToDisplay = ssprintf( "%*.*f%%", PERCENT_TOTAL_SIZE, PERCENT_DECIMAL_PLACES, fPercentDancePoints*100 );
// HACK: Use the last frame in the numbers texture as '-'
sNumToDisplay.Replace('-','x');
}
}
else
sNumToDisplay = ssprintf( "%*d", DANCE_POINT_DIGITS, max( 0, iActualDancePoints ) );
m_textPercent.SetText( sNumToDisplay );
}
+7
View File
@@ -150,11 +150,18 @@ inline float randomf( const float low=-1.0f, const float high=1.0f )
return RandomFloat( low, high );
}
/* return f rounded to the nearest multiple of fRoundInterval */
inline float froundf( const float f, const float fRoundInterval )
{
return int( (f + fRoundInterval/2)/fRoundInterval ) * fRoundInterval;
}
/* return f truncated to the nearest multiple of fTruncInterval */
inline float ftruncf( const float f, const float fTruncInterval )
{
return int( (f)/fTruncInterval ) * fTruncInterval;
}
// Move val toward other_val by to_move.
void fapproach( float& val, float other_val, float to_move );
+1 -1
View File
@@ -511,7 +511,7 @@ void ScreenEvaluation::Init()
/* Use "ScreenEvaluation Percent" for the [metric set], but position and
* tween it with "PercentP1X", etc. */
m_Percent[p].SetName( "ScreenEvaluation Percent" );
m_Percent[p].Load( (PlayerNumber) p, &g_CurStageStats, true );
m_Percent[p].Load( p, &g_CurStageStats, true );
m_Percent[p].SetXY( THEME->GetMetricF(m_sName, ssprintf("PercentP%dX",p+1)),
THEME->GetMetricF(m_sName,ssprintf("PercentP%dY",p+1)) );
m_Percent[p].Command( THEME->GetMetric(m_sName,ssprintf("PercentP%dOnCommand",p+1)) );
+1 -2
View File
@@ -197,14 +197,13 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
LOG->Trace( "GetGrade: Actual: %f, Possible: %f", Actual, Possible );
#define ROUNDING_ERROR 0.00001f
Grade grade = GRADE_FAILED;
float fPercent = (Possible == 0) ? 0 : Actual / Possible;
FOREACH_Grade(g)
{
if( fPercent >= PREFSMAN->m_fGradePercent[g]-ROUNDING_ERROR )
if( fPercent >= PREFSMAN->m_fGradePercent[g] )
{
grade = g;
break;