Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 你如何贬低一个大人物?_Perl_Bignum - Fatal编程技术网

Perl 你如何贬低一个大人物?

Perl 你如何贬低一个大人物?,perl,bignum,Perl,Bignum,滥发大量警告: perl -Mbigrat -E'for (1..100) { $i += 1/3; say int($i), "\t", sprintf "%.55f", $i }' 在不使用-Mbigrat的情况下再次运行,以查看sprintf所需的效果 如何将实例$i降级为一个普通的可升级到sprintf 版本: bigrat0.47 Math::BigRat0.2612 答案不那么严肃: Argument "100/3" isn't numeric in addition (+) a

滥发大量警告:

perl -Mbigrat -E'for (1..100) { $i += 1/3; say int($i), "\t", sprintf "%.55f", $i }'
在不使用
-Mbigrat
的情况下再次运行,以查看sprintf所需的效果

如何将实例
$i
降级为一个普通的可升级到
sprintf

版本:

  • bigrat
    0.47
  • Math::BigRat
    0.2612

    • 答案不那么严肃:

      Argument "100/3" isn't numeric in addition (+) at …/site_perl/5.24.1/Math/BigRat.pm line 1939.
      

      我希望
      Math::BigRat
      提供一种获取普通数字的方法,它确实做到了:

      • 整数的
        as_int
      • 作为浮点数
        用于浮点数
      为了调试的目的,我插入了打印
      $\uuu

      $i->as_int()
      的作用与
      int($i)
      相同:

      $i->as_float()
      乍一看似乎像预期的那样工作,但我不理解输出。所有小数位均为零,且每第二行
      $i
      等于
      $\u

      $ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_int() }'
      ...
      99      33      33.0000000000000000000000000000000000000000000000000000000
      100     33      33.0000000000000000000000000000000000000000000000000000000
      
      这是Perl 5.30.0和Math::BigRat 0.2614

      因此警告是固定的,但是这个解决方案似乎有问题

      更新:根据评论中的要求,不使用
      sprintf

      $ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_float() }'
      ...
      90      30      30.0000000000000000000000000000000000000000000000000000000
      91      30      91.0000000000000000000000000000000000000000000000000000000
      92      30      92.0000000000000000000000000000000000000000000000000000000
      93      31      31.0000000000000000000000000000000000000000000000000000000
      94      31      94.0000000000000000000000000000000000000000000000000000000
      95      31      95.0000000000000000000000000000000000000000000000000000000
      96      32      32.0000000000000000000000000000000000000000000000000000000
      97      32      97.0000000000000000000000000000000000000000000000000000000
      98      32      98.0000000000000000000000000000000000000000000000000000000
      99      33      33.0000000000000000000000000000000000000000000000000000000
      100     33      100.0000000000000000000000000000000000000000000000000000000
      

      FWIW bigrat@0.39和Math::bigrat在0.2608没有此警告。将bigrat升级到0.47,会带来Math-BigInt-1.999811,但确实有一个警告,但是,
      在字符串eq中使用了未初始化的值,位于…/5.22.2/Math/BigFloat.pm第3626行。
      手动更新Math::BigRat给了我您的警告。您报告过这个问题吗?如果您省略sprintf并直接将
      打印为\u float
      ?看起来你得到的是简化形式的分数的分子,而不是正确的数值。
      $ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", sprintf "%.55f", $i->as_float() }'
      ...
      90      30      30.0000000000000000000000000000000000000000000000000000000
      91      30      91.0000000000000000000000000000000000000000000000000000000
      92      30      92.0000000000000000000000000000000000000000000000000000000
      93      31      31.0000000000000000000000000000000000000000000000000000000
      94      31      94.0000000000000000000000000000000000000000000000000000000
      95      31      95.0000000000000000000000000000000000000000000000000000000
      96      32      32.0000000000000000000000000000000000000000000000000000000
      97      32      97.0000000000000000000000000000000000000000000000000000000
      98      32      98.0000000000000000000000000000000000000000000000000000000
      99      33      33.0000000000000000000000000000000000000000000000000000000
      100     33      100.0000000000000000000000000000000000000000000000000000000
      
      $ perl -Mbigrat -E'for (1..100) { $i += 1/3; say $_, "\t", int($i), "\t", $i->as_float() }'
      ...
      90      30      30
      91      30      91
      92      30      92
      93      31      31
      94      31      94
      95      31      95
      96      32      32
      97      32      97
      98      32      98
      99      33      33
      100     33      100