如何舍入小数位?

时间:2017-04-22 05:49:04

标签: perl

我使用sprintf和printf函数来舍入十进制数,如果第100个位置小于5,则向下舍入,如果第100个位置大于5,则向上舍入。

my $a = 1.12;
my $b = sprintf("%.1f", $a);
print "Unrounded: $a\nRounded: $b\n";
printf "Unrounded: $a\nRounded: %.1f\n", $a;

有没有办法将小数点向上舍入(例如$b = 1.2)?

2 个答案:

答案 0 :(得分:2)

您可以使用核心ceil模块中的POSIX函数向上舍入到下一个整数。在操作之前和之后将您的值乘以10的幂,以向上舍入到给定的小数位数

另外,请勿使用标识符$a$b;它们保留供sort内置运算符

使用
use strict;
use warnings 'all';

use POSIX 'ceil';

my $aa = 1.12;
print "Unrounded:  $aa\n";

my $bb = sprintf("%.1f", $aa);
print "Rounded:    $bb\n";

my $cc = ceil($aa * 10) / 10;
print "Rounded up: $cc\n";

输出

Unrounded:  1.12
Rounded:    1.1
Rounded up: 1.2

答案 1 :(得分:1)

您可以使用nhimult()库中的Math::Round功能

  

nhimult TARGET,LIST

     

返回LIST中数字的下一个更高倍数。目标必须是积极的。在标量上下文中,返回单个值;在列表上下文中,返回值列表。在目标的两倍数之间的数字将被调整到代数更高的LIST的最接近的倍数。例如:

只需nhimult(0.1, $a)作为

#!/usr/bin/perl

use Math::Round qw( :all );
my $a = 1.12;
my $b = sprintf("%.1f", $a);
print "Unrounded: $a\nRounded: $b\n";
printf "Unrounded: $a\nRounded: %.1f\n", $a;
printf "Unrounded: $a\nRounded: %.1f\n", $a;    
printf "Next higher multiple of $a: %.1f\n",  nhimult(0.1, $a);

产生

Unrounded: 1.12
Rounded: 1.1
Unrounded: 1.12
Rounded: 1.1
Unrounded: 1.12
Rounded: 1.1
Next higher multiple of 1.12, 1.2

您可以通过

获取Math::Round
perl -MCPAN -e 'install Math::Round'

并导入所有函数qw(:all)