如何在Perl中向下舍入到给定的小数位数

时间:2014-07-16 23:31:29

标签: perl floating-point

我想要向下舍入到 N 小数位(两分钱的分数)。例如

5.0166 => 5.01
0.933  => 0.93

sprintf向最接近的数字舍入,因此不能产生我想要的数字。例如

sprintf("%.2f", 5.0166) => 5.02

3 个答案:

答案 0 :(得分:5)

使用POSIX :: floor(http://perldoc.perl.org/POSIX.html):

use POSIX;
$original = 5.0166;
$rounded = POSIX::floor($original*100)/100;
print "$rounded\n";

如果你处理负数并且你宁愿向零舍入而不是向下舍入,那么使用:

$rounded = ($original < 0)?(POSIX::ceil($original*100)/100)
                          :(POSIX::floor($original*100)/100);

或只是

$rounded = int($original*100)/100;

答案 1 :(得分:2)

您可以混淆调用int以及乘法和除法来来回移动小数点,或者您可以使用字符串替换,如下所示,这将适用于小于1E15的任何内容大于1E-4

这将有效

use strict;
use warnings;
use 5.010;

for (5.0166, 0.933) {
  say s/\.\d\d\K.+//r;
}

<强>输出

5.01
0.93

答案 2 :(得分:0)

使用更多行显示步骤。

$x=5.0166;
$y=int($x*100);
$y=$y/100;
print "$y\n";