2009-12-03 37 views
13

Có cách nào để thiết lập chính xác điểm nổi của tập lệnh Perl (thành 3 chữ số), mà không phải thay đổi nó cụ thể cho mỗi biến không?Làm cách nào để đặt độ chính xác của dấu chấm động trong Perl?

Something tương tự như TCL:

global tcl_precision 
set tcl_precision 3 
+0

Bạn có muốn chỉ có ba chữ số, hoặc ba chữ số sau chữ số thập phân? Có một sự khác biệt :) –

+0

là có cách nào để làm bất kỳ điều gì trong số họ? –

Trả lời

12

Không có cách nào để thay đổi trên toàn cầu này.

Nếu chỉ dành cho mục đích hiển thị, hãy sử dụng sprintf("%.3f", $value);.

Cho mục đích toán học, sử dụng (int(($value * 1000.0) + 0.5)/1000.0). Điều này sẽ làm việc cho số dương. Bạn sẽ cần phải thay đổi nó để làm việc với số âm mặc dù.

+1

Nếu nó chỉ dành cho mục đích hiển thị thì hãy đặt '$ # = '%. 3f'' - xem' perldoc perlvar' – mob

+0

'$ #' được loại bỏ trong Perl 5.10: ( – skaurus

+1

@ SinanÜnür no, you cant! Ví dụ:' perl -E '$ _ = 155, nói sprintf ("%. 2f", $ _/1000);' 'Nên in' 0,16' nhưng in '0,15'. (Xem: http://stackoverflow.com/q/24493228/734304) – kobame

19

Sử dụng Math::BigFloat hoặc bignum:

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

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

Hoặc với bignum thay vì làm:

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

Sau đó, trong cả hai trường hợp:

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

tôi sẽ không khuyên bạn nên sử dụng sprintf ("% .3f", $ value).

hãy nhìn vào ví dụ sau: (6,02 * 1,25 = 7,525)

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

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

1

Hãy đối xử với kết quả như là một chuỗi và sử dụng substr. Như thế này:

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

Nếu bạn muốn làm tròn, hãy làm như chuỗi quá. Chỉ cần có được nhân vật tiếp theo và quyết định.

0

Hoặc bạn có thể sử dụng sau đây để cắt xén bất cứ điều gì xảy ra sau khi các chữ số thứ ba sau dấu thập phân:

if ($val =~ m/([-]?[\d]*\.[\d]{3})/) { 
    $val = $1; 
} 
Các vấn đề liên quan