我想将数字舍入到特定数字或它们的倍数。对于整数,它是可以的,但是当我想要循环到多个浮点数时出现问题,如下例所示:
我要围绕的package
的数量(或倍数):
2.6
当我输入
1
时,它应向上舍入到2.6
当我输入
2,5
时,它应向上舍入到2,6
当我输入
3
时,它应向上舍入5,2 (2 * 2,6)
我尝试使用fmod
来检查可分性,但它对我不起作用。
谢谢大家。
答案 0 :(得分:3)
您可以将您的数字除以基础浮点数,将其四舍五入到最近的整数,然后重新乘以。
伪造的代码
def round_to_float(base_float,to_round)
return ceiling(to_round / base_float) * base_float
end
3
的例子:
ceiling(3.0 / 2.6) * 2.6
ceiling(1.15) * 2.6
2 * 2.6
5.2
对于多次检查,您可以使用fmod($to_round,$base_float) == 0
,但不可避免地存在浮点不准确性,并且它不是测试浮点数的可靠方法。
要确定,您应该选择足够小的epsilon
(按照计算机上的机器精度顺序),并确保您的商to_round/base_float
在其epsilon
范围内{ {1}}。
将它们放在一起
floor
其中epsilon是一个非常小的数字。理论上它应该是你的机器精度......通常类似10 ^ -9。实际上,在大多数用例中,10 ^ -4就足够了。