16

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

类似于 TCL 的东西:

global tcl_precision
set tcl_precision 3
4

5 回答 5

22

使用Math::BigFloatbignum

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
于 2009-12-03T11:18:01.487 回答
16

没有办法在全球范围内改变这一点。

如果只是出于显示目的,请使用sprintf("%.3f", $value);.

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

于 2009-12-03T09:57:23.097 回答
3

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

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

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

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

于 2011-06-08T18:00:24.187 回答
1

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

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

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

于 2012-11-28T17:51:59.347 回答
0

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

if ($val =~ m/([-]?[\d]*\.[\d]{3})/) {
    $val = $1;  
}
于 2012-12-19T18:07:19.647 回答