2009-12-03 12 views
13

Czy istnieje sposób ustawienia dokładności zmiennoprzecinkowej skryptu Perla (na 3 cyfry), bez konieczności zmiany jej dla każdej zmiennej?Jak ustawić precyzję zmiennoprzecinkową w Perlu?

Coś podobnego do TCL:

global tcl_precision 
set tcl_precision 3 
+0

Chcesz tylko trzy cyfry, lub trzech cyfr po przecinku? Jest różnica :) –

+0

Czy jest jakiś sposób na ich wykonanie? –

Odpowiedz

12

Nie ma sposobu, aby globalnie zmienić.

Jeśli jest to tylko do celów wyświetlania, należy użyć sprintf("%.3f", $value);.

Do celów matematycznych należy użyć (int(($value * 1000.0) + 0.5)/1000.0). To działałoby dla liczb dodatnich. Będziesz jednak musiał go zmienić, by działał z liczbami ujemnymi.

+1

Jeśli jest to tylko do celów wyświetlania, ustaw '$ # = '%. 3f'' - patrz' perldoc perlvar' – mob

+0

'$ #' jest usuwany w Perlu 5.10 :( – skaurus

+1

@ SinanÜnür nie, nie możesz! Przykład: 'perl -E '$ _ = 155; powiedz sprintf ("%. 2f", $ _/1000); '' Powinno wydrukować '0.16', ale wypisuje' 0.15'. (Patrz: http://stackoverflow.com/q/24493228/734304) – kobame

19

Zastosowanie Math::BigFloat lub bignum:

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

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

Albo z bignum zamiast zrobić:

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

Następnie w obu przypadkach:

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

nie polecam używać sprintf ("% .3f", wartość $).

Proszę spojrzeć na poniższy przykład: (6,02 * 1,25 = 7,525)

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

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

1

traktować wynik jako ciąg i używać substr. W ten sposób:

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

Jeśli chcesz zaokrąglić, zrób to również jako ciąg. Po prostu zdobądź kolejną postać i zdecyduj.

0

Albo można użyć następujących obciąć co przychodzi po trzeciej cyfry po przecinku:

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