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

2024-05-14 19:56:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我为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。尽管我使用了取整指令来反对这一点,但它仍将舍入到52.2

当我将这个52.2500的结果乘以100000000时,它显示为51249999,因此它舍入为52.2

我怎样才能防范这种情况

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

任何帮助或指点都会很棒的谢谢

詹姆斯


Tags: 数据代码importdataraw浮点pd计算结果
1条回答
网友
1楼 · 发布于 2024-05-14 19:56:44

另一个答案:根据@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,例如第一个数字的小数 float(数据['Outcome_alternative'][0])您将得到四舍五入的数字。如果您使用str(Data['output\u alternative'][0]),您实际上得到的是您的数字,但它是一个字符串

相关问题 更多 >

    热门问题