Python浮点除法ny zero E

2024-09-19 23:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

Python浮点除零错误。我找不到任何错误。有人能修好吗?我在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 + "%"

Tags: selfidtruefieldsstringresultfloatresults
1条回答
网友
1楼 · 发布于 2024-09-19 23:31:57

我认为你的if测试要做的是:

if not float(num_questions):

换句话说,如果float(num_questions)为零,因此为false,则您希望跳过包含/ float(num_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}%"

相关问题 更多 >