Pergunta

Existe uma maneira para definir a precisão de ponto flutuante de um script Perl (3 dígitos), sem ter que mudá-lo especificamente para cada variável?

Algo semelhante ao TCL de:

global tcl_precision
set tcl_precision 3
Foi útil?

Solução

Não há nenhuma maneira de globalmente mudar isso.

Se é apenas para fins de exibição, em seguida, uso sprintf("%.3f", $value);.

Para fins matemáticos, utilize (int(($value * 1000.0) + 0.5) / 1000.0). Isso poderia funcionar para números positivos. Você precisará alterá-lo para o trabalho com números negativos embora.

Outras dicas

Use Math::BigFloat ou bignum :

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

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

Ou com bignum vez fazer:

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

Em seguida, em ambos os casos:

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

Eu não recomendaria a utilização sprintf ( "%. 3F", $ value).

Por favor, olhe o exemplo a seguir: (6,02 * 1,25 = 7,525)

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

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

tratar o resultado como uma string e uso substr . Como esta:

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

Se você quer fazer arredondamentos, fazê-lo como corda também. Basta chegar o próximo caractere e decidir.

Ou você poderia usar o seguinte para truncar o que vem depois do terceiro dígito depois do ponto decimal:

if ($val =~ m/([-]?[\d]*\.[\d]{3})/) {
    $val = $1;  
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top