Skip to content

Commit

Permalink
fix: increase grades rounding precision
Browse files Browse the repository at this point in the history
Enabling the rounding in openedx#16837 has been causing noticeable (up to 1 percentage
point) differences between non-rounded subsection grades and a total grade for
a course. This increases the grade precision to reduce the negative
implications of double rounding.

(cherry picked from commit 84d2ad9)
  • Loading branch information
Agrendalath committed Sep 25, 2024
1 parent 446a483 commit 60b582d
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 14 deletions.
8 changes: 4 additions & 4 deletions lms/djangoapps/grades/rest_api/v1/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ def setUpClass(cls):
+ [
{
'category': 'Homework',
'detail': 'Homework Average = 0%',
'detail': 'Homework Average = 0.00%',
'label': 'HW Avg', 'percent': 0.0,
'prominent': True
}
Expand Down Expand Up @@ -332,21 +332,21 @@ def setUpClass(cls):
},
{
'category': 'Lab',
'detail': 'Lab Average = 0%',
'detail': 'Lab Average = 0.00%',
'label': 'Lab Avg',
'percent': 0.0,
'prominent': True
},
{
'category': 'Midterm Exam',
'detail': 'Midterm Exam = 0%',
'detail': 'Midterm Exam = 0.00%',
'label': 'Midterm',
'percent': 0.0,
'prominent': True
},
{
'category': 'Final Exam',
'detail': 'Final Exam = 0%',
'detail': 'Final Exam = 0.00%',
'label': 'Final',
'percent': 0.0,
'prominent': True
Expand Down
4 changes: 2 additions & 2 deletions lms/djangoapps/grades/scores.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ def compute_percent(earned, possible):
Returns the percentage of the given earned and possible values.
"""
if possible > 0:
# Rounds to two decimal places.
return around(earned / possible, decimals=2)
# Rounds to four decimal places.
return around(earned / possible, decimals=4)
else:
return 0.0

Expand Down
8 changes: 4 additions & 4 deletions lms/djangoapps/grades/tests/test_course_grade_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,26 +185,26 @@ def test_course_grade_summary(self):
'section_breakdown': [
{
'category': 'Homework',
'detail': 'Homework 1 - Test Sequential X with an & Ampersand - 50% (1/2)',
'detail': 'Homework 1 - Test Sequential X with an & Ampersand - 50.00% (1/2)',
'label': 'HW 01',
'percent': 0.5
},
{
'category': 'Homework',
'detail': 'Homework 2 - Test Sequential A - 0% (0/1)',
'detail': 'Homework 2 - Test Sequential A - 0.00% (0/1)',
'label': 'HW 02',
'percent': 0.0
},
{
'category': 'Homework',
'detail': 'Homework Average = 25%',
'detail': 'Homework Average = 25.00%',
'label': 'HW Avg',
'percent': 0.25,
'prominent': True
},
{
'category': 'NoCredit',
'detail': 'NoCredit Average = 0%',
'detail': 'NoCredit Average = 0.00%',
'label': 'NC Avg',
'percent': 0,
'prominent': True
Expand Down
2 changes: 1 addition & 1 deletion lms/djangoapps/grades/tests/test_subsection_grade.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
@ddt
class SubsectionGradeTest(GradeTestBase): # lint-amnesty, pylint: disable=missing-class-docstring

@data((50, 100, .50), (59.49, 100, .59), (59.51, 100, .60), (59.50, 100, .60), (60.5, 100, .60))
@data((50, 100, .5), (.5949, 100, .0059), (.5951, 100, .006), (.595, 100, .0059), (.605, 100, .006))
@unpack
def test_create_and_read(self, mock_earned, mock_possible, expected_result):
with mock_get_score(mock_earned, mock_possible):
Expand Down
6 changes: 3 additions & 3 deletions xmodule/graders.py
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ def grade(self, grade_sheet, generate_random_scores=False):
section_name = scores[i].display_name

percentage = scores[i].percent_graded
summary_format = "{section_type} {index} - {name} - {percent:.0%} ({earned:.3n}/{possible:.3n})"
summary_format = "{section_type} {index} - {name} - {percent:.2%} ({earned:.3n}/{possible:.3n})"
summary = summary_format.format(
index=i + self.starting_index,
section_type=self.section_type,
Expand Down Expand Up @@ -421,7 +421,7 @@ def grade(self, grade_sheet, generate_random_scores=False):
if len(breakdown) == 1:
# if there is only one entry in a section, suppress the existing individual entry and the average,
# and just display a single entry for the section.
total_detail = "{section_type} = {percent:.0%}".format(
total_detail = "{section_type} = {percent:.2%}".format(
percent=total_percent,
section_type=self.section_type,
)
Expand All @@ -430,7 +430,7 @@ def grade(self, grade_sheet, generate_random_scores=False):
'detail': total_detail, 'category': self.category, 'prominent': True}, ]
else:
# Translators: "Homework Average = 0%"
total_detail = _("{section_type} Average = {percent:.0%}").format(
total_detail = _("{section_type} Average = {percent:.2%}").format(
percent=total_percent,
section_type=self.section_type
)
Expand Down

0 comments on commit 60b582d

Please sign in to comment.