在Perl中四舍五入到2位小数
症状 我下面的函数返回错误的四舍五入0.57,而不是0.58 Perl源代码在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
#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
术语混淆)