Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用2位数字与3位数字时,django中的数学结果不正确?_Python_Django - Fatal编程技术网

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

Python 使用2位数字与3位数字时,django中的数学结果不正确?,python,django,Python,Django,编辑:问题是浮点数学(请参阅此处了解信息:)。将公式更改为: (votes_yes + votes_no) * .55 致: Django 1.3.7,python 2.7 在我的模型中,我正在执行一些简单的数学运算,以便在通过管理界面提交时自动填充结果字段。我的问题是,这是不正确的工作,并希望有人能解释为什么这可能是 工作原理:如果有55%或以上的赞成票,则结果应发布为已批准,如果没有,则失败。问题在于,显然,对于2位数字,结果是不正确的 例如:如果我输入550票赞成和450票反对,结果

编辑:问题是浮点数学(请参阅此处了解信息:)。将公式更改为:

(votes_yes + votes_no) * .55 
致:


Django 1.3.7,python 2.7

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

工作原理:如果有55%或以上的赞成票,则结果应发布为已批准,如果没有,则失败。问题在于,显然,对于2位数字,结果是不正确的

例如:如果我输入550票赞成和450票反对,结果会像你预期的那样正确地显示为“批准”。但是,如果我输入55票赞成和45票反对,则结果将显示为“失败”,即使公式(投票数+投票数)*.55正好等于55,且结果应被批准

如果我使用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

这是由于浮点数学。与您可能期望的相反,执行
(45+55)*.55实际上等于
55.00000000000001
。您应该改为使用公式:

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

浮点数学,包括
100*0.55
,是不精确的。在我的实现中,
100*0.55
的计算结果为
55.00000000000000 7
。您可以定义一个合理的增量,使用内置的
decimal
库并牺牲性能以获得精确性,也可以修改为仅使用整数-(x*55/100)将按照通常的Python截断语义将所有内容保留在整数数学中。非常感谢您的解释。我现在一切都很好。
if self.votes_yes >= math.floor((self.votes_yes + self.votes_no) * .55):