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。尽管我使用 ROUND_UP 指示反对这一点,但它一直四舍五入到 52.2。
当我将此 52.2500 结果乘以 1000000000 时,它显示为 512499999,因此它舍入为 52.2。
我该如何防范呢?
我在上面编写了一个代码片段来演示,但在我的实际练习中,我从 CSV 导入带有分子和分母的完整原始数据,然后在 Python 中计算结果。我是否需要在开始时向我的 pd.read_csv 添加一些代码以确保 num/denom 不会作为浮点数导入?或者确保我的结果计算不是浮点数?或两者?
任何帮助或指示都会非常感谢
詹姆士
解决方案
另一个答案:根据@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]) 你实际上得到你的号码,但作为一个字符串。
推荐阅读
- java - 使用 Firebase 消息传递通知时出现空指针异常
- javascript - 使用 Node.js、Express 和 MySQL 的更好方法是什么?
- swift - 如何在 SwiftUI 中将点击事件添加到整个视图
- sql - 通过 sql 查询 (pyodbc) 写入数据帧:pyodbc.Error: ('HY004', '[HY004])
- linux - 删除任何重复行并保持原始顺序的脚本
- vue.js - Vue:更新深度不会触发重新渲染
- java - 我不知道如何处理这个 java.lang.ClassCastException
- .net - .NET core Auth cookie 共享
- javascript - 在节点快递中解析 JSON - 以分隔符之间的 \n 结尾?
- solr - 使用基本身份验证时如何在 solr 7 中创建核心