整数乘以float然后除以相同的float - 一种将值强制回原始整数的简洁方法

时间:2013-02-27 16:00:56

标签: floating-point floating-accuracy floating-point-precision

好吧,我们有经典的1 * 1/3 * 3 = 0.9999999。我明白为什么会这样。

在我的用例中,我试图得到一个整数。我很乐意接受我的价值,除非无限精确数学表明我们应该得到一个整数开始(参见:上面的用例)。

有没有常用的方法来实现这一目标?

示例:

double myFloat = 1.0 / 2.0;

1 * myFloat * 2 = 2结果:2

myFloat = 1.0 / 2.0;

2.5 * myFloat * 2 = 2.5结果:2

myFloat = 1.0 / 3.0;

1 * myFloat * 3 = .9999结果:1

myFloat = 1.0 / 3.0;

.9 * myFloat * 3 = .9结果:0

我想到的一种方法是在铺设它之前总是在我的结果上添加一些delta。我希望以一种干净,普遍接受的方式实现我的结果。

编辑:根据反馈意见进行了更改。

1 个答案:

答案 0 :(得分:0)

将f(x)舍入到最接近的整数,round(f(x))

比较f(x)和round(f(x))。如果它们足够接近以使得差异归因于舍入,则使用round(f(x))作为结果。如果没有,请使用floor(x)。

如果输入都具有相似的幅度,则对于某些固定数量的epsilon使用abs(f(x)-round(f(x))< epsilon可能就足够了。如果不是,则使用abs((f( x)-round(f(x))/ f(x))< epsilon for non-zero f(x)。