Python Float除以零错误。我找不到任何错误。有人可以修复它吗?我在Odoo版本10中使用了此代码。我尝试了其他方法,但无法正常工作。希望对别人也有帮助。
class etq_results(models.Model):
_name = "etq.result"
_description = "Exam Result"
exam_id = fields.Many2one('etq.exam', string="Exam", readonly=True)
user_id = fields.Many2one('student.student',"Exam candidate / Student", translate=True)
score = fields.Float(string="Score", compute="_compute_score", store=True)
results = fields.One2many('etq.result.question', 'result_id', string="Results", readonly=True)
token = fields.Char(string="Token")
state = fields.Selection([('incomplete','Incomplete'), ('complete','Complete')], string="State")
@api.one
@api.depends('results')
def _compute_score(self):
num_questions = self.env['etq.result.question'].search_count([('result_id', '=', self.id)])
correct_questions = self.env['etq.result.question'].search_count([('result_id', '=', self.id), ('correct', '=', True)])
# raise UserError(_(float(num_questions)))
if float(num_questions) and float(correct_questions) is None:
self.score = 0.0
else:
self.score = float(correct_questions) + "/" + float(num_questions) + " " + (float(correct_questions) / float(num_questions)) * 100.0 + "%"
答案 0 :(得分:2)
我认为您正在尝试进行if
测试:
if not float(num_questions):
换句话说,如果float(num_questions)
为零(因此为假),则您想跳过其中带有/ float(num_questions)
的代码,这是非法的。 correct_questions
在这里无关紧要。毕竟,0 / 3
除法不是零除法。很好。
您实际上写的是完全不同的测试:
if float(num_questions) and float(correct_questions) is None:
您正在测试float(num_questions)
是真实的-与您想要的完全相反-还测试float(correct_questions) is None
-永远是不真实的,因为只有None is None
。因此,您将始终点击else
。因此,如果num_questions
值为零,您将得到除以零的结果。
您尝试的修复没有多大区别:
if float(num_questions) or float(correct_questions) == 0.0:
您正在测试num_questions
是真实的,它仍然与您想要的相反,或者correct_questions
是0。第一部分为假的唯一方法是如果没有问题-在这种情况下,没有正确的问题,因此第二部分将是正确的。因此,现在,您总是点击if
并始终显示0.0
。
如果您超过了这个范围,就会遇到另一个问题:
self.score = float(correct_questions) + "/" + float(num_questions) + " " + (float(correct_questions) / float(num_questions)) * 100.0 + "%"
您正在尝试添加浮点数和字符串。那是非法的。您可能想要的是字符串格式,如下所示:
pct = float(correct_questions) / float(num_questions) * 100.0
self.score = f"{correct_questions}/{num_questions} {pct}%"
或者,如果您使用的是旧版本的Python:
self.score = "{}/{} {}%".format(correct_questions, num_questions, pct)
您可能希望您的if
子句匹配相同的格式,而不仅仅是显示0.0
?
self.score = "0.0/0.0 0.0%"
我们正在这样做,一遍又一遍地调用float(correct_questions)
使您的代码更难阅读(也稍慢一些,但这可能无关紧要)。为什么不只调用一次并存储结果呢?
此外,这些真的是浮点数而不是整数吗?来自数据库计数操作的称为num_questions
的东西肯定是整数,对吧?
因此,将它们放在一起:
num_questions = int(self.env['etq.result.question'].search_count([('result_id', '=', self.id)]))
correct_questions = int(self.env['etq.result.question'].search_count([('result_id', '=', self.id), ('correct', '=', True)]))
pct = 0.0
if num_questions:
pct = correct_questions * 100.0 / num_questions
self.score = f"{correct_questions}/{num_questions} {pct}%"