2

我想将数字四舍五入到特定数字或它们的倍数。对于整数是可以的,但是当我想像这个例子一样四舍五入到浮点数时会出现问题:

package我要四舍五入的数量(或多个) :

2.6

当我输入1它应该四舍五入2.6

当我输入2,5它应该四舍五入2,6

当我输入3它应该四舍五入 5,2 (2 * 2,6)

我试图用fmod它来检查可分性,但它对我不起作用。

谢谢大家。

4

1 回答 1

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_floatepsilonfloor.

把它们放在一起

def round_to_float(base_float,to_round)
    quotient = to_round / base_float
    if (absolute_value(quotient - floor(quotient)) < epsilon)
        return false
    else
        return ceiling(quotient) * base_float
    end
end

其中 epsilon 是一个非常小的数字。从理论上讲,它应该是您的机器精度……通常是 10^-9。实际上,在大多数用例中 10^-4 应该就足够了。

于 2013-06-14T06:46:34.293 回答