如何将从CSV数据集获取的两个均值浮点值转换为整数比例?
如何将两个浮点均值转换为整数比例?
问题背景
从CSV数据集计算得到两类事件的平均到场单位数:
mean_buildingFire = 10.82500730353491 # 111 - Building fire的平均到场单位数 mean_smoke = 4.057505093955173 # 651 - Smoke scare, odor of smoke的平均到场单位数
现有提取均值的Python代码:
mean_buildingFire = dataset.loc[dataset['INCIDENT_TYPE_DESC'] == '111 - Building fire', 'UNITS_ONSCENE'].mean() mean_smoke = dataset.loc[dataset['INCIDENT_TYPE_DESC'] == '651 - Smoke scare, odor of smoke', 'UNITS_ONSCENE'].mean() print(mean_buildingFire) print(mean_smoke)
需要将这两个浮点数值转换为最简整数比例。
解决方案
方法1:使用fractions模块自动约分
Python的fractions.Fraction类可直接处理浮点数并完成约分,通过limit_denominator方法能避免浮点数精度问题导致的超大分母:
from fractions import Fraction # 计算比值并简化 ratio = Fraction(mean_buildingFire, mean_smoke) # 限制分母最大值为1000,得到近似的合理整数比 simplified_ratio = ratio.limit_denominator(1000) print(f"最简整数比例:{simplified_ratio.numerator}:{simplified_ratio.denominator}")
针对你的数值,运行后会输出 8:3(因为10.825/4.0575≈2.668,接近8/3≈2.6667)。
方法2:手动缩放+最大公约数(GCD)约分
先将浮点数放大为整数,再通过计算最大公约数完成约分,规避浮点数精度影响:
import math # 选择足够大的缩放因子,保留浮点数精度 scaling_factor = 10 ** 12 num1 = int(mean_buildingFire * scaling_factor) num2 = int(mean_smoke * scaling_factor) # 计算两个整数的最大公约数 gcd_val = math.gcd(num1, num2) # 约分得到最简整数比 simplified_num1 = num1 // gcd_val simplified_num2 = num2 // gcd_val print(f"最简整数比例:{simplified_num1}:{simplified_num2}")
此方法同样会得到近似8:3的结果。
注意事项
- 浮点数存在精度误差,直接使用
Fraction可能生成极复杂的分数,limit_denominator是实用的折中方案。 - 手动缩放时,需根据浮点数的小数位数选择合适的缩放因子,避免精度丢失或整数溢出。
内容的提问来源于stack exchange,提问作者user31081998
相关产品推荐
相关产品推荐

