美文网首页
perl基础 perl 中取整(2):Math::Round模

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

作者: 学生信的大叔 | 来源:发表于2022-05-23 00:21 被阅读0次

前言

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

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

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

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

小结

  • Math::Round提供了以不同方式对数字进行舍入的函数。默认导入roundnearest的函数;其它8个操作符的使用必须使用所述"use Math::Round qw(:all);" 导入所有函数才可以使用。

  • 所有操作符,根据标量上下文返回标量值,根据列表上下文返回列表值,也就是可以对标量与列表使用.

  • 对于需要目标TARGET 的操作符,目标TARGET 必须为正数.

  • 并不是所有操作符都常用,建议记住roundnearst 即可.

  • 从 Perl 5.22 开始,POSIX 模块默认导入所有函数,包括一个名为“round”的函数。如果您同时使用 POSIX和此模块,请谨慎行事。

  • 最下面的脚本部分, 不建议看,内容太多,变量太多,没有意思,而且并没有写完所有操作符(脚本内只写了5个操作符,实在是内容重复再重复,懒得写了).可以对下面的脚本perl_math_round.pl 执行perl perl_math_round.pl > math_round.md ,然后用markdown打开看看.

  • 其中VARIABLE 没有看懂.

功能描述

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

  • round LIST

    将数字四舍五入为最接近的整数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个整数中间的数字将四舍五入“到无穷大”;即,正值向上取整(例如,2.5 变为 3)而负值向下取整(例如,-2.5 变为 -3)。

    从 Perl 5.22 开始,POSIX 模块默认导出所有函数,包括一个名为“round”的函数。如果您同时使用 POSIX 和此模块,请谨慎行事。

  • nearest TARGET, LIST

    将数字四舍五入到最接近的目标值倍数。目标必须是正数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于目标的两个倍数之间的数字将四舍五入为无穷大。例如:

    nearest(10, 40)    yields  40
    nearest(10, 44)            40
    nearest(10, 46)            50
    nearest(10, 45)            50
    nearest(25, 328)          325
    nearest(.1, 4.567)         4.6
    nearest(10, -45)          -50
    nearest 10,(-46,-45,-44,40,44,45,46,50)   -50 -50 -40 40 40 50 50 50
    
  • round_even LIST

    将数字四舍五入为最接近的整数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个整数中间的数字四舍五入到最接近的偶数;例如,2.5 变为 2,3.5 变为 4,-2.5 变为 -2。

  • round_odd LIST

    将数字四舍五入为最接近的整数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个整数中间的数字四舍五入到最接近的奇数;例如,3.5 变为 3,4.5 变为 5,-3.5 变为 -3。

  • round_rand LIST

    将数字四舍五入为最接近的整数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个整数中间的数字随机方式向上或向下舍入。例如,在大量试验中,2.5 将变为 2 的一半时间和 3 的一半时间。

  • nearest_ceil TARGET, LIST

    将数字四舍五入到最接近的目标值倍数。目标必须是正数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个目标倍数之间的数字将四舍五入到上限,即下一个代数更高的倍数,换句话说就是倾向x轴右侧取值,注意负数的取值结果即可。

    例如:

    nearest_ceil(10, 44)    yields  40
    nearest_ceil(10, 45)            50 #向x周右侧取值
    nearest_ceil(10, -45)          -40 #向x周右侧取值
    
  • nearest_floor TARGET, LIST

    将数字四舍五入到最接近的目标值倍数。目标必须是正数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于两个目标倍数中间的数字将四舍五入到,即下一个代数较低的倍数,换句话说,就是倾向x轴左侧取值,注意负数的取值结果即可。例如:

    nearest_floor(10, 44)    yields  40
    nearest_floor(10, 45)            40 #向x轴左侧取值
    nearest_floor(10, -45)          -50 #向x轴左侧取值
    
  • nearest_rand TARGET, LIST

    将数字四舍五入到最接近的目标值倍数。目标必须是正数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。介于目标的两个倍数之间的数字将以随机方式向上或向下舍入。例如,在大量试验中,nearest(10, 45)将产生 40 一半的时间和 50 一半的时间。

  • nlowmult TARGET, LIST

    返回 LIST 中数字的下一个较低倍数。目标必须是正数。在标量上下文中,返回单个值;在列表上下文中,返回值列表。在目标的两个倍数之间的数字将被调整为 LIST 的最接近的倍数,这些倍数在代数上较低。例如:

    nlowmult(10, 44)    yields  40
    nlowmult(10, 46)            40
    nlowmult(25, 328)          325
    nlowmult(.1, 4.567)          4.5
    nlowmult(10, -41)          -50
    
  • nhimult TARGET, LIST

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

    nhimult(10, 44)    yields  50
    nhimult(10, 46)            50
    nhimult(25, 328)          350
    nhimult(.1, 4.512)          4.6
    nhimult(10, -49)          -40
    

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";

相关文章

网友评论

      本文标题:perl基础 perl 中取整(2):Math::Round模

      本文链接:https://www.haomeiwen.com/subject/uxblprtx.html