使用2位数字和3位数字时,django的数学结果不正确?

时间:2015-12-07 17:29:47

标签: python django

编辑:问题是浮点数学(参见此处获取信息:http://floating-point-gui.de/)。更改公式:

(votes_yes + votes_no) * .55 

为:

(votes_yes + votes_no) * (55/100)

Django 1.3.7,python 2.7

在我的模型中,我执行了一些简单的数学运算,以便在通过管理界面提交时自动填充结果字段。我的问题是这不能正常工作,并希望有人能解释为什么会这样。

如何运作:如果有55%或更多的是投票,那么结果应该发布为已批准,如果不是则失败。问题是结果显然不正确2位数字。

例如:如果我输入550 votes_yes和450 votes_no,结果会正确发布为' Approved'正如你所料。但是,如果我输入55票赞成票票和45票赞成票票,结果将被贴在'失败'即使公式(votes_yes + votes_no)* .55的结果恰好等于55,结果也应该是Approved。

看来如果我使用3位数字,结果会很好,但两位数字必须大于55%,而不是大于或等于。例如:56票赞成,45票赞成。 任何帮助,为什么会发生这种情况将非常感激。

这是我的模型的编辑版本:

MAJORITY_REQUIREMENT = (
...
    ('2', '55%'),
...
)

POSSIBLE_RESULTS = (
    ('1', 'Approved'),
    ('2', 'Failed'),
)

class Measures(models.Model):
    votes_yes = models.IntegerField(blank=False)
    votes_no = models.IntegerField(blank=False)
    result = models.CharField(editable=False, max_length=30, choices=POSSIBLE_RESULTS)
    required_majority = models.CharField(max_length=1, blank=False, choices=MAJORITY_REQUIREMENT, default="1"

# do the math to get the result
    def save(self):
 ...
        if self.required_majority == '2':
            if self.votes_yes >= (self.votes_yes + self.votes_no) * .55:
                self.result = '1'
            else:
                self.result = '2'
...


    def __unicode__(self):
        return self.measure_name

1 个答案:

答案 0 :(得分:1)

这是由浮点数学引起的。与您的预期相反,执行(45+55)*.55实际上等于55.00000000000001。你应该用你的公式代替:

if self.votes_yes >= math.floor((self.votes_yes + self.votes_no) * .55):