采用浮点数,我想向下舍入,具体取决于用户定义的“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箱尺寸:
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个bin大小:
2348.285 will fall into a 2348 bin
238.592 will fall into a 238 bin
我已经研究了Perl中的舍入,例如floor(),sprintf()以及substr()方法,但是,他们都不想做我想做的事,或者说,我不能做它们做我想做的。 什么简洁的代码会动态地改变浮点数向下舍入到给定用户定义的bin大小的最低值?
答案 0 :(得分:5)
您可以尝试Math::Round:
use Math::Round 'nlowmult';
print nlowmult( .01, 2348.285 ) . "\n";
print nlowmult( .01, 238.592 ) . "\n";
答案 1 :(得分:1)
受some quirks约束,向下到任意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时,解决方法的解决方法是什么?)