我试图根据两个因素创建一个百分比(对于一个硬币计数程序),我必须创建一个人们计算硬币数量的准确度。这是通过计算他们计算的硬币包的总数以及他们已经正确计算的行李总数来计算的,占其总数的百分比。
在我的程序中,如果志愿者为该特定硬币输入硬币袋的正确重量,则将+1添加到bags_correct
列和total_bags
列。如果权重错误,+1会被添加到bags_incorrect
列以及total_bags
列。
然后我会用这个c.execute("UPDATE volunteers SET bags_correct = bags_correct + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name))
来计算一个百分比(准确度),但我得到奇怪的值,如'0'或'400',它需要是一个百分比,即0%到100%,但我这样做很麻烦。
我曾尝试将real
改为integer
,但同样的事情发生了
我以任何方式计算错了吗?
conn = sqlite3.connect("volunteers.db")
c = conn.cursor()
c.execute("""CREATE TABLE volunteers (
name text,
bags_correct integer,
bags_incorrect integer,
total_bags integer,
total_bags_value integer,
percentage real
)""")
####This is when NEW volunteers add their first bag of coins when they counted it CORRECTLY without weight error.
c.execute("INSERT INTO volunteers VALUES (?, ?, ?, ?, ?, ?)", (name, 1, 0,
1, 100, 100))
conn.commit()
HOWEVER
####This is when NEW volunteers add their first bag of coins BUT it is INCORRECT
c.execute("INSERT INTO volunteers VALUES (?, ?, ?, ?, ?, ?)", (name, 0, 1,
1, 100, 0))
conn.commit()
####This is when NON-NEW volunteers add their bag of coins if it's CORRECT, hence the UPDATE.
c.execute("UPDATE volunteers SET bags_correct = bags_correct + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name))
conn.commit()
####This is when NON-NEW volunteers add their bag of coins but it's INCORRECT.
c.execute("UPDATE volunteers SET bags_incorrect = bags_incorrect + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name))
conn.commit()
注意:total_bag_value是便士。
我不确定我是否准确理解了您的要求,但有两件事我认为更新查询不正确。
bags_correct
增加total_bags
和1
,然后做一个percentage = (bags_correct / total_bags) * 100
。您的行李将在此处正确更新,但您的百分比将根据行李的先前值计算,因为在您提交交易之前更新实际上不适用于数据库。你应该做percentage = (bags_correct + 1/ total_bags + 1) * 100
。bags_correct
小于total_bags
时,您的除法自动计算为0.您需要做的是需要将列转换为浮点数(或者至少是分子符号会自动强制浮动分区)。像percentage = (CAST(bags_correct AS FLOAT) / CAST(total_bags AS FLOAT)) * 100
之类的东西。如果要将百分比存储为INT
,可以根据需要将结果转换回整数。我希望这有帮助。