首页 > 解决方案 > 尝试根据表中的值计算 Python sqlite3 中的百分比

问题描述

我正在尝试根据两个因素(对于硬币计数程序)创建一个百分比,我必须在其中创建人们计数硬币的准确度。这是通过获取他们计算的硬币袋总数以及他们正确计算的袋子总数占总数的百分比来计算的。

在我的程序中,如果志愿者为该特定硬币输入正确的硬币袋重量,则 +1 将添加到bags_correct列 ANDtotal_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 以便士为单位。

标签: pythonmathsqlitesql-updatepercentage

解决方案


我不确定我是否准确理解了您的要求,但我认为更新查询有两点不正确。

  1. 您正在尝试更新一列并使用同一列计算同一 SQL 语句中另一列的值。这是不正确的。例如,在您的第一个更新语句中,您递增bags_correct,然后total_bags执行. 您的包将在此处正确更新,但您的百分比将根据包的先前值计算,因为更新实际上不适用于数据库,直到您提交事务。你应该改为做.1percentage = (bags_correct / total_bags) * 100percentage = (bags_correct + 1/ total_bags + 1) * 100

  2. 第二个问题是袋子的所有列都是整数,而您想要进行浮点除法。您正在计算的百分比是进行整数除法,因此只要bags_correct小于total_bags,您的除法就会自动计算为 0。您需要做的是您需要将列转换为浮点数(或者至少是分子会自动强制浮点除法)。类似的东西percentage = (CAST(bags_correct AS FLOAT) / CAST(total_bags AS FLOAT)) * 100。如果要将百分比存储为INT,可以根据需要将结果转换回整数。

我希望这有帮助。


推荐阅读