【问题标题】:How do I set the floating point precision in Perl?如何在 Perl 中设置浮点精度?
【发布时间】:2010-12-22 18:25:29
【问题描述】:

有没有办法设置 Perl 脚本的浮点精度(到 3 位),而不必专门为每个变量进行更改?

类似于 TCL 的东西:

global tcl_precision
set tcl_precision 3

【问题讨论】:

  • 您只需要三位数字,还是小数点后三位?有区别:)
  • 有什么办法可以做到吗?

标签: perl floating-point floating-accuracy


【解决方案1】:

没有办法全局改变这一点。

如果只是为了显示,请使用sprintf("%.3f", $value);。

出于数学目的,请使用(int(($value * 1000.0) + 0.5) / 1000.0)。这适用于正数。不过,您需要将其更改为使用负数。

【讨论】:

  • 如果只是为了显示,那么设置$#='%.3f' -- 见perldoc perlvar
  • $# 在 Perl 5.10 中被删除 :(
  • @SinanÜnür 不,你不能!示例:perl -E'$_ = 155; say sprintf("%.2f", $_/1000);' 应该打印 0.16 但打印 0.15。 (见:stackoverflow.com/q/24493228/734304)
  • @SinanÜnür ;) 我(现在)对浮点表示有了更多的了解。我评论了您的评论,因为声明 您也可以将 _sprintf("%.3f", $value) 用于数学目的 根本不正确(在某些情况下)。我认为,与大多数初学者 perl 程序员(一个月前算上我)相比,perl 可以给出 2 位数精度的“好结果”——尤其是当 perl 专家(你)说时——可以使用。 .. :) :)
【解决方案2】:

使用Math::BigFloat 或bignum:

use Math::BigFloat;
Math::BigFloat->precision(-3);

my $x = Math::BigFloat->new(1.123566);
my $y = Math::BigFloat->new(3.333333);

或者用bignum 代替:

use bignum ( p => -3 );
my $x = 1.123566;
my $y = 3.333333;

那么在这两种情况下:

say $x;       # => 1.124
say $y;       # => 3.333
say $x + $y;  # => 4.457

【讨论】:

    【解决方案3】:

    我不建议使用 sprintf("%.3f", $value)。

    请看下面的例子: (6.02*1.25 = 7.525)

    printf("%.2f", 6.02 * 1.25) = 7.52

    printf("%.2f", 7.525) = 7.53

    【讨论】:

      【解决方案4】:

      将结果视为字符串并使用substr。像这样:

      $result = substr($result,0,3);
      

      如果要进行舍入,也可以将其作为字符串进行。只需获得下一个角色并决定。

      【讨论】:

        【解决方案5】:

        或者您可以使用以下内容截断小数点后第三位之后的内容:

        if ($val =~ m/([-]?[\d]*\.[\d]{3})/) {
            $val = $1;  
        }
        

        【讨论】:

          猜你喜欢
          • 2014-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-23
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多