Python Float除法ny零错误

时间:2018-07-31 04:18:31

标签: python odoo odoo-10

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 + "%"

1 个答案:

答案 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}%"