2013-10-29 45 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