在Perl中四舍五入到2位小数

在Perl中四舍五入到2位小数,perl,rounding,Perl,Rounding,症状 我下面的函数返回错误的四舍五入0.57,而不是0.58 Perl源代码 #Live Demo #!/usr/bin/perl #### INPUT PARAMETERS $rate=0.505; $spread=0.07; $precision=2; #### DEBUG print " Debug Session \n"; $rate1 = (10**$precision)*($rate+$spread); print " 001 Rate1 is

症状 我下面的函数返回错误的四舍五入0.57,而不是0.58

Perl源代码

#Live Demo 
#!/usr/bin/perl

#### INPUT PARAMETERS
$rate=0.505;
$spread=0.07;
$precision=2;

#### DEBUG
print " Debug Session \n";
$rate1 = (10**$precision)*($rate+$spread);
print " 001  Rate1 is $rate1\n";
$rate2 = ((10**$precision)*($rate+$spread))+0.5;
print " 002  Rate2 is $rate2\n";
$rate3 = int (((10**$precision)*($rate+$spread))+0.5);
print " 003  Rate3 is $rate3\n";
$rate4 = int (((10**$precision)*($rate+$spread))+0.5)/(10**$precision);
print " 004  Rate4 is $rate4\n";
#### PRODUCTION
print " Production Session \n";
$rate = int (((10**$precision)*($rate+$spread))+0.5)/(10**$precision);
print " Production  Rate_production is $rate\n";

如Perl()的
int
函数文档中所述

返回EXPR的整数部分。如果省略EXPR,则使用$\。您不应该使用此函数进行舍入:一是因为它向0截断,二是因为浮点数的机器表示有时会产生违反直觉的结果。例如,int(-6.725/0.025)生成-268,而不是正确的-269;那是因为它实际上更像是-268.999999999439315658。通常,sprintf、printf或POSIX::floor和POSIX::ceil函数将比int更好地为您服务

更新为使用sprintf:

#Live Demo 
#!/usr/bin/perl

#### INPUT PARAMETERS
$rate=0.505;
$spread=0.07;
$precision=2;

#### DEBUG
print " Debug Session \n";
$rate1 = (10**$precision)*($rate+$spread);
print " 001  Rate1 is $rate1\n";
$rate2 = ((10**$precision)*($rate+$spread))+0.5;
print " 002  Rate2 is $rate2\n";
$rate3 = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5));
print " 003  Rate3 is $rate3\n";
$rate4 = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5))/(10**$precision);
print " 004  Rate4 is $rate4\n";
#### PRODUCTION
print " Production Session \n";
$rate = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5))/(10**$precision);
print " Production  Rate_production is $rate\n";

如Perl()的
int
函数文档中所述

返回EXPR的整数部分。如果省略EXPR,则使用$\。您不应该使用此函数进行舍入:一是因为它向0截断,二是因为浮点数的机器表示有时会产生违反直觉的结果。例如,int(-6.725/0.025)生成-268,而不是正确的-269;那是因为它实际上更像是-268.999999999439315658。通常,sprintf、printf或POSIX::floor和POSIX::ceil函数将比int更好地为您服务

更新为使用sprintf:

#Live Demo 
#!/usr/bin/perl

#### INPUT PARAMETERS
$rate=0.505;
$spread=0.07;
$precision=2;

#### DEBUG
print " Debug Session \n";
$rate1 = (10**$precision)*($rate+$spread);
print " 001  Rate1 is $rate1\n";
$rate2 = ((10**$precision)*($rate+$spread))+0.5;
print " 002  Rate2 is $rate2\n";
$rate3 = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5));
print " 003  Rate3 is $rate3\n";
$rate4 = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5))/(10**$precision);
print " 004  Rate4 is $rate4\n";
#### PRODUCTION
print " Production Session \n";
$rate = sprintf ("%.2f", (((10**$precision)*($rate+$spread))+0.5))/(10**$precision);
print " Production  Rate_production is $rate\n";

$rate2
不完全等于58,它是57.999999999929,这就是为什么
int()而不是保持58
$rate2
四舍五入为57,它是57.999999999999929,这就是
int()的原因
四舍五入到57,而不是保留58如果您已经使用
sprintf
四舍五入,那么
10**$precision
的内容是多余的
$rate=sprintf(%.2f,$rate+$spread)
就足够了(并且不会把事情和
$err
术语混淆)
10**$precision
如果你已经在用
sprintf
四舍五入,那么
$rate=sprintf(“%.2f”,$rate+$spread)
就足够了(并且不会将事物与
$err
术语混淆)