Como faço para definir a precisão de ponto flutuante em Perl?
-
12-09-2019 - |
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
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;
}