2009-12-03 65 views
13

有沒有辦法設置一個Perl腳本的浮點精度(3位數字),而不必爲每個變量專門更改?如何在Perl中設置浮點精度?

類似的東西,以TCL的:

global tcl_precision 
set tcl_precision 3 
+0

你想只有三位數,或小數點後三位數?有一個區別:) – 2010-01-26 00:13:20

+0

有沒有辦法做到他們中的任何一個? – 2010-01-26 10:09:14

回答

12

沒有辦法在全球範圍內改變這種狀況。

如果僅用於顯示目的,則使用sprintf("%.3f", $value);

出於數學目的,請使用(int(($value * 1000.0) + 0.5)/1000.0)。這將對正數起作用。不過,您需要將其更改爲使用負數。

+1

如果只是爲了顯示目的,然後設置'$#='%。3f'' - 請參閱'perldoc perlvar' – mob 2009-12-05 09:33:43

+0

'$#'在Perl 5.10中刪除:( – skaurus 2013-04-11 22:24:25

+1

@SinanÜnürno,you can not!例子:'perl -E'$ _ = 155;說sprintf(「%。2f」,$ _/1000);''應該打印'0.16',但打印'0.15'(參見:http://stackoverflow.com/q/24493228/734304) – kobame 2014-07-01 09:44:26

19

使用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 
2

我不建議用sprintf( 「%.3f」,$ value)。

請看下面的例子: (6.02×1.25 = 7.525)

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

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

1

治療的結果作爲一個字符串,並使用substr。就像這樣:

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

如果你想要做的舍入,做它作爲字符串了。只要得到下一個角色並決定。

0

或者你可以使用以下方法來截斷小數點後第三位以後無論發生什麼事:

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