perl基础 perl 中取整(2):Math::Round模

2022-05-23  本文已影响0人  学生信的大叔

前言

并不用看完所有内容,看完小结功能描述 前两个操作符即可,后面内容太多,而且不是所有操作符都常用.记一下大概功能,回头用到的时候再来查即可.

模块与内容参考地址:https://metacpan.org/pod/Math::Round

Math::Round 为 非perl自带模块,使用前需要安装下.

本人也是perl的初学者,文中内容可能有描述不当或者错误的地方,请仔细辨别.

小结

功能描述

这部分主要是译自https://metacpan.org/pod/Math::Round , 加了一点自己的补充. 不理解的地方建议看下原英文部分.

VARIABLE

没看懂

The variable $Math::Round::half is used by most routines in this module. Its value is very slightly larger than 0.5, for reasons explained below. If you find that your application does not deliver the expected results, you may reset this variable at will.

标准浮点免责声明

主要是计算机中浮点数与我们所说浮点数的差异需要额外注意下,具体的我还不是很明白

当然,浮点数是实数的有理子集,因此用它们进行的计算并不总是准确的。应该在两个其他数字之间的数字可能会让您感到惊讶;例如,0.85 可能不正好介于 0.8 和 0.9 之间,并且 (0.75 - 0.7) 可能与 (0.85 - 0.8) 不同。

为了给出更可预测的结果,这些例程使用的二分之一值略大于 0.5。然而,如果要四舍五入的数字存储为浮点数,它们将像往常一样受到硬件、C 编译器等的影响。

脚本

#/usr/bin/env perl

#use strict;
use warnings;
use Math::Round qw(:all);

my @arr = (-3.8,-3.5,-3.4,-3,-2.8,-2.5,-2.4,-2,0,2,2.4,2.5,2.8,3,3.4,3.5,3.8,4);
my ($result,$item);
#################################
## 测试 round($x)
#################################
print '## 测试round($x)函数结果:',"\n";

sub myround{
    foreach $item (@arr){
        $result = round $item;
        print '传入数值为:',"$item\t";
        print 'round结果为:',"$result\n" || print 'ERROR:print round',"$item\n";
        #print 
}
}
&myround; #调用
print '- round($x)小结:总是四舍五入',"\n";
print '- round($x)小结:从 Perl 5.22 开始,POSIX 模块默认导出所有函数,包括一个名为“round”的函数。如果您同时使用 POSIX 和此模块,请谨慎行事。',"\n\n";

my @result = round @arr;
print "列表是\n@arr\n";
print "round结果是\n@result\n";

#################################
## 测试 round_even LIST
#################################

print '## 测试round_even LIST函数结果:',"\n";
sub myround_even{
    foreach my $item (@arr){
        my $result = round_even $item;
        print '传入数值为:',"$item\t";
        print 'round_even结果为:',"$result\n" || print 'ERROR:print round',"$item\n";
        #print 
}
}
&myround_even; #调用

@res_arr = round_even @arr ;
print "列表是\n@arr\n";
print "round_even结果是\n@result\n";

#################################
## 测试 round_odd LIST
#################################

print '## 测试round_odd LIST函数结果:',"\n";
sub myround_odd{
    foreach my $item (@arr){
        my $result = round_odd $item;
        print '传入数值为:',"$item\t";
        print 'round_odd结果为:',"$result\n" || print 'ERROR:print round_odd',"$item\n";
        #print 
}
}
&myround_odd; #调用

@res_arr = round_odd @arr ;
print "列表是\n@arr\n";
print "round_odd结果是\n@result\n";

#################################
## 测试 round_rand LIST
#################################

print '## 测试round_rand LIST函数结果:',"\n";
sub myround_rand{
    foreach my $item (@arr){
        my $result = round_rand $item;
        print '传入数值为:',"$item\t";
        print 'round_odd结果为:',"$result\n" || print 'ERROR:print round_odd',"$item\n";
        #print 
}
}
&myround_rand; #调用

@res_arr = round_rand @arr ;
print "列表是\n@arr\n";
print "round_odd结果是\n@result\n\n";

my @arr2 = (-2.5,-2.5,-2.5,-2.5,-2.5,2.5,2.5,2.5,2.5,2.5);
@res_arr = round_rand @arr2;
print "列表是\n@arr2\n";
print "round_rand结果是\n@res_arr\n\n";

#################################
## 测试 nearest TARGET, LIST
#################################
print  "## 测试 nearest TARGET, LIST\n";
my $res_near;
$res_near = nearest(10, 40);    #yields  40
print 'nearest(10, 40)结果为:',"$res_near\n";
$res_near = nearest(10, 44);    #yields  40
print 'nearest(10, 44)结果为:',"$res_near\n";
$res_near = nearest(10, 46)  ;         # 50
print 'nearest(10, 46)结果为:',"$res_near\n";
$res_near = nearest(10, 45);           # 50
print 'nearest(10, 45)结果为:',"$res_near\n";
$res_near = nearest(25, 328);          #325
print 'nearest(25, 328)结果为:',"$res_near\n";
$res_near = nearest(.1, 4.567);         # 4.6
print 'nearest(.1, 4.567)结果为:',"$res_near\n";
$res_near = nearest(10, -45) ;        # -50
print 'nearest(10, -45)结果为:',"$res_near\n\n";

my @arr_near = (-46,-45,-44,40,44,45,46,50);
my @res_near = nearest 10,@arr_near;
print "目标是10,列表是\n@arr_near\n";
print "结果是\n@res_near\n\n";
上一篇 下一篇

猜你喜欢

热点阅读