大家早上好,
我在浮点数学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中!
我希望有人可以帮助我解决我的具体问题,并准确解释他们的解决方案为什么有效,以便我下次理解这一点。
我的程序需要做两件事:
- 对小数列表求和,确定它们的总和是否正好为 1.0
- 确定 1.0 和数字总和之间的差 - 将变量的值设置为精确的差,使总和等于 1.0。
例如:
[0.28, 0.55, 0.17] -> 总和应为 1.0,但我一直得到 1.xxxxxx。我正在以下列方式实现总和:
sum = array.inject(0.0){|sum,x| sum+ (x*100)} / 100
我需要这个功能的原因是我正在读取一组来自 excel 的小数。它们不是 100% 精确的(它们缺少一些小数点),因此总和通常来自 0.999999xxxxx 或 1.000xxxxx。例如,我将获得如下值:
0.568887955,0.070564759,0.360547286
为了解决这个问题,我可以取前 n-1 个数字的总和,然后稍微改变最终数字,使所有数字总和为 1.0(必须使用上面的等式或任何我最终得到的验证) )。我目前正在实施如下:
sum = 0.0
array.each do |item|
sum += item * 100.0
end
array[i] = (100 - sum.round)/100.0
我知道我可以用注入来做到这一点,但我试图用它来看看有什么用。我认为这通常是有效的(通过检查输出),但它并不总是满足上面的验证总和。所以如果需要,我也可以调整这个。请注意,我在这些数字中只需要两个小数精度 - 即 0.56 而不是 0.5623225。我可以在演示时或在此计算期间将它们四舍五入……这对我来说并不重要。
非常感谢您的帮助!