首页 > 解决方案 > 如何避免浮点(入)精度影响舍入

问题描述

我为 NHS 工作,生成临床结果数据,并且在 Python 3 中舍入存在一个长期存在的问题。以前在这里我得到了一个很好的代码来生成我需要的舍入(即不是银行家的舍入),但我已经意识到我遇到的另一个问题是浮点字段本身的准确性。我遇到的具体例子如下:

import pandas as pd
import math
raw_data = {'AreaCode' : ['101', '101', '101'],
            'Disaggregation' : ['1864', '65Over', 'Total'],
            'Numerator' : [19.0, 82.0, 101.0],
            'Denominator' : [24.0, 160.0, 184.0]}

Data = pd.DataFrame(raw_data, columns = ['AreaCode', 'Disaggregation', 'Numerator', 'Denominator'])

Data['Outcome'] = (Data['Numerator'] / (Data['Denominator'])*100)

Data

如图所示,65+ 的结果是 52.250000。尽管我使用 ROUND_UP 指示反对这一点,但它一直四舍五入到 52.2。

当我将此 52.2500 结果乘以 1000000000 时,它显示为 512499999,因此它舍入为 52.2。

我该如何防范呢?

我在上面编写了一个代码片段来演示,但在我的实际练习中,我从 CSV 导入带有分子和分母的完整原始数据,然后在 Python 中计算结果。我是否需要在开始时向我的 pd.read_csv 添加一些代码以确保 num/denom 不会作为浮点数导入?或者确保我的结果计算不是浮点数?或两者?

任何帮助或指示都会非常感谢

詹姆士

标签: pythonpandasrounding

解决方案


另一个答案:根据@juanpa.arrivallaga 的评论,您也可以通过以下方式解决您的问题:


import pandas as pd
import math
raw_data = {'AreaCode' : ['101', '101', '101'],
            'Disaggregation' : ['1864', '65Over', 'Total'],
            'Numerator' : [19.0, 82.0, 101.0],
            'Denominator' : [24.0, 160.0, 184.0]}

Data = pd.DataFrame(raw_data, columns = ['AreaCode', 'Disaggregation', 'Numerator', 'Denominator'])

Data['Outcome'] = (Data['Numerator'] / (Data['Denominator'])*100)

from decimal import *
def division_using_decimals(numerator,denominator):
    return Decimal(numerator)/Decimal(denominator)

#loop using list comprehension
Data['Outcome_alternative'] = [100*division_using_decimals(Data['Numerator'][x],Data['Denominator'][x]) for x in range(len(Data))]


请注意,如果您将 Decimal 类传递给例如第一个数字 float(Data['Outcome_alternative'][0]) 的浮点数,您将获得四舍五入的数字。如果你使用 str(Data['Outcome_alternative'][0]) 你实际上得到你的号码,但作为一个字符串。


推荐阅读