几周前,我收到了一段非常有用的代码,可帮助我使用将 1.25 舍入到 1.3 的原则(Python 3 不这样做作为标准)将我的健康数据结果舍入到 1dp。 不幸的是,我遇到了一个实例,其中我新定义的舍入规则不起作用! 有人可以建议修改下面的 my_round 吗? 这太令人沮丧了,因为我以为我在这里找到了完美的解决方案。

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'])

def my_round(n, ndigits=1):
    try:
       part = n * 10 ** ndigits
       delta = part - int(part)
       # always round "away from 0"
       if delta >= 0.5 or -0.5 < delta <= 0:
           part = math.ceil(part)
       else:
           part = math.floor(part)
       val =  part/(10 ** ndigits)
    except ValueError:
       val = np.nan
    return val

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

运行所有这些后,您可以看到 65Over 的结果在计算结果为 82.0 / 160.0 * 100 = 51.250000 时四舍五入为 51.2。 我必须确定这样的实例会在我发布的数据中输出为 51.3。

#1楼 票数:0

您可能会遇到“半偶数舍入”或“银行家舍入”。 51.25 将四舍五入为 51.2,51.35 将四舍五入为 51.4。 在计算中防止聚合错误是很常见的。 不过,您可以自定义它。 请参阅如何在 Python 中正确舍入半浮点数?

此外,您的代码可能无法正常工作,因为当 delta 恰好为 0.5 时,它需要浮点数之间完全相等才能使delta >= 0.5位工作。 除以 10 可能会使您失去精度,因此您随后无法获得完全相等。

编辑:您的问题是原始计算82.0 / 160.0 * 100为您提供的答案不再是 51.25,因为浮点除法/乘法导致精度损失。 首先相乘以使数字保持整数会有所帮助。 但实际上,您需要使用 Decimal ( https://docs.python.org/3/library/decimal.html ) 模块来确保十进制算术为您提供“自然答案”。

  ask by nnn1234 translate from so

未解决问题?本站智能推荐:

2回复

在R中的一个变量的不同值上使用floor和天花板

我想在 R 中格式化一个变量,使用round 、 floor或ceiling 。 但是,我有时想使用floor ,有时对同一个变量的不同值使用ceiling 。 那可能吗? 我的数据框是data ,我想格式化的变量是var 。 这些是它的值(带频率): 我想要的结果是一个变量var2 ,如下所示:
2回复

bash:如何舍入/地板/天花板非十进制千数?

假设我在这里有这个号码100675 如何把它变成101000 我在谷歌上找到的所有解决方案都在解决小数。
2回复

为什么楼层(0.99999999999999999)=1和楼层(0.9999999999999999)=0?

PHP中的floor函数表现得很奇怪。 对于16个十进制值,它给出了底值,但是通过增加1位小数。 它是在某处定义/解释的,在这一点上它给出了“圆”值? 是否有任何函数给出0无论如何有多少9位小数?
1回复

OpenACC和楼层/天花板功能

我想在OpenACC项目中使用C的下限/上限功能。 当我想对值进行原子更新时。 编译器显示以下消息: PGCC-S-0155-无效的原子表达式PGCC-S-0155-无效的原子区域。 可能是什么问题呢?
1回复

帮助找到向量的地板和天花板

我为月份和月份数字创建了向量,然后为 6-9 个月创建了向量,从那里开始,平均值...... 七月现在我必须使用地板和天花板函数来返回平均夏季月份的上下限。 我以为我在正确的轨道上,但我遇到了错误! 想法?
4回复

带小数位数的地板和天花板

我需要用特定的小数位数来计算浮点数。 所以: 函数np.round接受decimals参数,但似乎函数ceil和floor不接受小数位数,并且始终返回小数点为零的数字。 当然我可以将数字乘以10^ndecimals ,然后应用地板,最后除以10^ndecimals 但我想知道是否有一个内置函数可以做
1回复

Z3中的地板和天花板功能实现

我尝试实现以下链接中定义的地板和天花板功能 https://math.stackexchange.com/questions/3619044/floor-or-ceiling-function-encoding-in-first-order-logic/3619320#3619320 但是Z3查询返
4回复

python中熊猫系列的地板或天花板?

我有一个熊猫系列series 。 如果我想获得按元素划分的地板或天花板,是否有内置方法,还是必须编写函数并使用应用程序? 我问是因为数据很大,所以我很欣赏效率。 也没有就 Pandas 包提出这个问题。