2009-12-03 21 views
13

C'è un modo per impostare la precisione in virgola mobile dello script Perl (su 3 cifre), senza doverla modificare in modo specifico per ogni variabile?Come si imposta la precisione in virgola mobile in Perl?

Qualcosa di simile a TCL di:

global tcl_precision 
set tcl_precision 3 
+0

Vuoi solo tre cifre o tre cifre dopo la virgola? C'è una differenza :) –

+0

c'è un modo per fare nessuno di loro? –

risposta

12

Non v'è alcun modo per modificare globalmente questo.

Se è solo per scopi di visualizzazione, utilizzare sprintf("%.3f", $value);.

Per scopi matematici, utilizzare (int(($value * 1000.0) + 0.5)/1000.0). Questo funzionerebbe per numeri positivi. Avresti bisogno di cambiarlo per funzionare con numeri negativi però.

+1

Se è solo per scopi di visualizzazione quindi impostare '$ # = '% 3f'' - vedi' perldoc perlvar' – mob

+0

'$ #' viene rimosso in Perl 5.10 :( – skaurus

+1

@ SinanÜnür no, non puoi Esempio:.! 'Perl . -E '$ _ = 155; dire sprintf ("% 2f", $ _/1000);' '' dovrebbe stampare 0.16' ma stampe '0.15' (vedi: http://stackoverflow.com/q/24493228/734.304) – kobame

19

Usa Math::BigFloat o bignum:

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

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

O con bignum invece fanno:

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

Poi, in entrambi i casi:

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

non consiglierei di usare sprintf ("% .3f", valore $).

Si prega di guardare il seguente esempio: (6,02 * 1,25 = 7,525)

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

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

1

Trattare il risultato come una stringa e utilizzare substr. In questo modo:

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

Se si desidera eseguire l'arrotondamento, farlo anche come stringa. Prendi il prossimo personaggio e decidi.

0

Oppure si potrebbe utilizzare il seguente per troncare ciò che viene dopo la terza cifra dopo la virgola:

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