1

取一个浮点数,我想根据用户定义的“bin”大小四舍五入。因此,bin 大小将根据用户偏好而变化。例如,bin 大小可以是 0.5、0.1、1 甚至 0.01。

我的目标是确定浮点数将落入哪个bin。举个例子:

一个 0.1 的 bin 大小:

2348.285 will fall into a 2348.2 bin

238.592 will fall into a 238.5 bin

一个 0.5 的 bin 大小:

2348.285 will fall into a 2348.0 bin

238.592 will fall into a 238.5 bin

一个 0.01 的 bin 大小:

2348.285 will fall into a 2348.28 bin

238.592 will fall into a 238.59 bin

1 箱大小:

2348.285 will fall into a 2348 bin

238.592 will fall into a 238 bin

例如,我研究过 Perl 中的舍入, floor()、sprintf() 和 substr() 方法,但是,它们都不是我想要做的,或者更确切地说,我不能让它们做我想做的事想。在给定用户定义的 bin 大小的情况下,哪些简洁的代码会动态更改浮点数向下舍入的底值?

4

2 回答 2

5

你可以试试Math::Round

use Math::Round 'nlowmult';

print nlowmult( .01, 2348.285 ) . "\n";
print nlowmult( .01, 238.592 ) . "\n";
于 2013-10-29T22:56:51.900 回答
1

受到一些怪癖的影响,四舍五入到任意 bin 大小的公式是

use POSIX 'floor';

$bin = $bin_size * floor( $value / $bin_size )

(例如)24.01 / 0.01 => 2400.99999999999996758 =>回合的一种解决方法是扰乱您的输入,例如2400

$epsilon = 1.0e-12;

$bin = $bin_size * floor( ($value+$epsilon) / $bin_size)

或者

$bin = $bin_size * floor( $value / $bin_size + $epsilon )

请注意,乘以可能1/$bin_size比除以更好$bin_size。例如,您已经看到带有值的浮点运算可能0.1会很麻烦,因此计算$value * 10可能不会像$value / 0.1.

24.01 - $epsilon(但是当您的实际输入是并且您打算将其四舍五入到 24.00时,解决方法是什么?)

于 2013-10-29T22:57:49.173 回答