如何避免浮点精度影响舍入



我为英国国家医疗服务体系(NHS(工作,负责生成临床结果数据,在Python 3中长期存在舍入问题。在此之前,我收到了一个优秀的代码来生成我需要的舍入(即不是Banker的舍入(,但后来我意识到,我遇到的另一个问题是浮点字段本身的准确性。我遇到的具体例子如下:

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不会作为浮点值导入?或者确保我的结果计算不是浮动的?还是两者兼而有之?

任何帮助或指示都将是辉煌的感谢

James

另一个答案:根据@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类传递给第一个数字的浮点值为examlpefloat(Data['Outcome_alternate'][0](,您将得到四舍五入的数字。如果你使用str(Data['Outcome_alternate'][0](,你实际上得到了你的数字,但它是一个字符串。

最新更新