Python中如何使59.725与59.72497两个相近数值均向上取整为59.73?
实现向上取整到两位小数,让59.725和59.72497都变成59.73
看起来你需要的不是Python默认的四舍五入(银行家舍入),而是向上取整(天花板取整)到两位小数——不管第三位小数及以后的数值是多少,只要超过两位小数的部分不为零,就进一位到下一个两位小数。这样59.725和59.72497都会被舍入为59.73,正好满足你的需求。
问题根源
你之前用的round()函数采用的是银行家舍入规则(四舍六入五成双),再加上浮点数的精度特性,59.725实际在内存中可能存储为一个略大于59.725的值,所以round(59.725, 2)会得到59.73;而59.72497明显小于59.725,所以会被舍入为59.72。但你想要的是统一向上取整,所以需要换一种思路。
解决方案:使用math.ceil或numpy.ceil实现向上取整
向上取整的核心逻辑是:先把数值放大100倍(对应保留两位小数),取大于等于该值的最小整数,再缩小100倍还原。
方法1:用math.ceil结合pandas.apply(小数据集友好)
这个方法简单直观,适合数据量不大的场景:
import math import pandas as pd def ceil_df_columns(df, col_list): for col_name in col_list: # 对列中每个值执行:放大100倍→向上取整→缩小100倍 df[col_name] = df[col_name].apply(lambda x: math.ceil(x * 100) / 100) # 若遇到浮点数精度问题(比如某些值本应向上取整却没生效),可以加极小值修正: # df[col_name] = df[col_name].apply(lambda x: math.ceil((x + 1e-9) * 100) / 100) return df
方法2:用numpy.ceil实现向量化操作(推荐大数据集)
如果你处理的DataFrame行数很多,用numpy的向量化操作会比apply快得多,因为它是批量处理而非逐元素循环:
import numpy as np import pandas as pd def ceil_df_columns(df, col_list): for col_name in col_list: df[col_name] = np.ceil(df[col_name] * 100) / 100 return df
测试验证
我们来测试一下这两个函数的效果:
# 创建测试DataFrame test_df = pd.DataFrame({'target_col': [59.725, 59.72497, 59.72, 59.721]}) # 应用函数 result_df = ceil_df_columns(test_df, ['target_col']) print(result_df)
输出结果:
target_col 0 59.73 1 59.73 2 59.72 3 59.73
完全符合你的需求:59.725和59.72497都变成了59.73,刚好是两位小数的59.72保持不变,59.721也向上取整为59.73。
额外提示:优化你原来的函数
你之前的函数用了两层循环+replace,这种方式效率极低(尤其是数据量大的时候),因为replace会遍历整个列找匹配值。上面的方法都是直接对列进行批量处理,性能会提升很多。
内容的提问来源于stack exchange,提问作者ajnabz
相关产品推荐
相关产品推荐

