2013-10-29 43 views
1

取一个浮点数,我想舍入,取决于用户定义的'bin'大小。箱的大小因此会根据用户的偏好而改变。例如,箱尺寸可以是0.5,0.1,1或甚至0.01。在Perl中舍入到不同的小数位数计数

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

0.1块大小:

2348.285 will fall into a 2348.2 bin 

238.592 will fall into a 238.5 bin 

0.5块大小:

2348.285 will fall into a 2348.0 bin 

238.592 will fall into a 238.5 bin 

0.01块大小:

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大小?

回答

5

你可以尝试Math::Round

use Math::Round 'nlowmult'; 

print nlowmult(.01, 2348.285) . "\n"; 
print nlowmult(.01, 238.592) . "\n"; 
+0

尼斯的答案,简单呢! Thankyou – Rambatino

1

符合some quirks,下舍入到任意的块大小公式是

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有什么解决方法解决方法?)

+0

['int'](http://perldoc.perl.org/functions/int.html)? – TLP

+0

'int'四舍五入为负值输入。 – mob