【问题标题】:How should I do integer division in Perl?我应该如何在 Perl 中进行整数除法?
【发布时间】:2010-10-07 02:09:33
【问题描述】:

在 Perl 中总是进行整数除法的好方法是什么?

例如,我想要:

real / int = int

int / real = int

int / int = int

【问题讨论】:

    标签: perl integer-division


    【解决方案1】:

    这个问题至少有 2 个合理的答案。 (我最初只给出了答案2。)

    1. 使用 int() 函数将浮点计算结果截断为整数(去掉小数部分),正如 Bryan 在他的自我回答中所建议的那样:#539805

    2. 使用use integer pragma 使Perl 将两者的输入和计算结果截断为整数。它的范围在 { } 块内。

    例子:

    print 3.0/2.1 . "\n";      # => 1.42857142857143
    print 5.0/1.5 . "\n";      # => 3.33333333333333
    
    print int(3.0/2.1) . "\n"; # => 1
    print int(5.0/1.5) . "\n"; # => 3
    
    {
      use integer;
      print 3.0/2.1 . "\n";    # => 1
      print 5.0/1.5 . "\n";    # => 5 (because 1.5 was truncated to 1)
    }
    print 3.0/2.1 . "\n";      # => 1.42857142857143 again
    

    【讨论】:

    • 附加信息,括号分隔'使用整数'在块内,然后在块外,将在块前后使用标准实数计算。
    • 不使用 'use integer' 你总是可以写 -1 & $x 来返回 $x 的整数值 ...
    • @johannesvalks 这会将负整数转换为正的二进制补码,这可能不是您想要的。 “使用整数”也是有问题的,因为它是 signed 整数,所以会完全搞砸大的无符号数。 use integer 在 C89 编译器上也具有实现定义的行为,带有负输入。对于大多数大型输入,通过 int(a/b) 进行转换是错误的。为所有输入获得一致的结果真的很难。
    • 您正在改变整个现代计算甚至数学史上“整数除法”的定义!请参阅链接了解整数除法实际上是什么。您的方法对 5/1.5 产生 5,而整数除法产生 3。ibm.com/docs/en/zvse/6.2?topic=SSB27H_6.2.0/…
    • 公平点@FNia,虽然那个意思是 Perl 的选择,而不是我的选择。我修改了答案。
    【解决方案2】:

    您可以在 Perl 中转换整数:

    int(5/1.5) = 3;
    

    【讨论】:

    • 是的,但整数除法将是 int(5) / int(1.5)。否则,你只是在四舍五入。
    • 但是 int(5) / int(1.5) != int
    • 对不起,这是我真正想要的。在进行任何类型的除法之后,我想要一个 int 结果。所以是的,我正在寻找四舍五入。
    • 小心浮点舍入问题:int(-6.725/0.025) 是 -268 和 POSIX::floor(-6.725/0.025) 是 -269 see perldoc
    • 这是完全错误的,因为使用整数除法我们完全删除了点后的所有数字。然后 int math 5/1.5 是 5/1 eq 5 而不是 3,如本例所示。当我们向上/向下舍入数字时也是错误的,那么 5/1.5 是 5/2 eq 2.5=>3,但它等于 witn int(5/1.5) 偶然。这不是规则。
    【解决方案3】:

    int(x+.5) 会将 值四舍五入到最接近的整数。四舍五入更难。

    向零舍入:

    int($x)

    对于以下解决方案,请包含以下语句:

    use POSIX;

    向下取整:POSIX::floor($x)

    总结:POSIX::ceil($x)

    从零舍入:POSIX::floor($x) - int($x) + POSIX::ceil($x)

    四舍五入到最接近的整数:POSIX::floor($x+.5)

    请注意,int($x+.5) 对于负值会严重失败。 int(-2.1+.5)int(-1.6),即 -1。

    【讨论】:

    • 不,int 向零舍入,而正常向偶数舍入。运行perl -le 'printf "int(%s) is %d, round(%s) is %.0f;\n", ($_+0.5)x4 for -10..10',你会看到像 int(-3.5) is -3, round(-3.5) is -4; int(-2.5) 是-2,round(-2.5) 是-2; int(-1.5) 是-1,round(-1.5) 是-2; int(-0.5) 为 0,round(-0.5) 为 -0; int(0.5) 为 0,round(0.5) 为 0; int(1.5) 为 1,round(1.5) 为 2; int(2.5) 为 2,round(2.5) 为 2; int(3.5) 是 3,round(3.5) 是 4; int(4.5) 为 4,round(4.5) 为 4;
    • @tchrist 实际上,正常的舍入是向最近的;只有边界情况 0.5 向偶数舍入。
    【解决方案4】:

    你可以:

    use integer;
    

    由 Michael Ratanapintha 解释或手动使用:

    $a=3.7;
    $b=2.1;
    
    $c=int(int($a)/int($b));
    

    注意,'int' 不是强制转换。这是将数字转换为整数形式的函数。 这是因为 Perl 5 没有单独的整数除法。例外是当您“使用整数”时。那么你将失去真正的分裂。

    【讨论】:

      【解决方案5】:

      希望有效果

      int(9/4) = 2.

      谢谢 马诺库马尔

      【讨论】:

        【解决方案6】:

        整数除法 $x 除以 $y ...

        $z = -1 & $x / $y

        它是如何工作的?

        $x / $y

        返回浮点除法

        &

        执行按位与

        -1

        代表

        &HFFFFFFFF

        对于最大的整数...从哪里来

        $z = -1 & $x / $y

        给出整数除法...

        【讨论】:

        • perl -E 'my($x,$y)=(-12,4); my $z = -1 & $x/$y; say int($x/$y); say $x/$y; say $z;' 将给出:-3、-3、18446744073709551613。
        【解决方案7】:

        例如 9 / 4 = 2.25

        int(9) / int(4) = 2

        9 / 4 - 余数 / 分母 = 2

        9 /4 - 9 % 4 / 4 = 2

        【讨论】:

        • 这个答案是完全错误的。 “int(9)/int(4) == 2.25”,所以我认为 Paul 的意思是 int(9/4)
        • 我认为他没有测试他的例子
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 2016-01-01
        • 2010-09-07
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多