En Perl, ¿cómo puedo limitar el número de posiciones después del punto decimal, pero no tienen ceros?
-
05-09-2019 - |
Pregunta
Esta pregunta es similar a "dejar caer detrás de' 0.0' de flotadores" , pero para Perl y con un número máximo de dígitos después de la coma decimal.
Estoy buscando una manera de convertir los números de formato de cadena, dejando caer cualquier redundante '0', que incluye no sólo justo después del punto decimal. Y aún con un número máximo de la tecnología digital, por ejemplo, 3
Los datos de entrada es flotadores. salida deseada:
0 -> 0
0.1 -> 0.1
0.11 -> 0.11
0.111 -> 0.111
0.1111111 -> 0.111
Solución
También puede utilizar Matemáticas :: Ronda para hacer esto:
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.1), "\n"'
0.1
$ perl -MMath::Round=nearest -e 'print nearest(.001, 0.11111), "\n"'
0.111
Otros consejos
Utilice la siguiente directamente:
my $s = sprintf('%.3f', $f);
$s =~ s/\.?0*$//;
print $s
... o definir una subrutina para hacerlo más genéricamente:
sub fstr {
my ($value,$precision) = @_;
$precision ||= 3;
my $s = sprintf("%.${precision}f", $value);
$s =~ s/\.?0*$//;
$s
}
print fstr(0) . "\n";
print fstr(1) . "\n";
print fstr(1.1) . "\n";
print fstr(1.12) . "\n";
print fstr(1.123) . "\n";
print fstr(1.12345) . "\n";
print fstr(1.12345, 2) . "\n";
print fstr(1.12345, 10) . "\n";
Las impresiones:
0
1
1.1
1.12
1.123
1.123
1.12
1.12345
Puede utilizar "sprintf" combinada con "eval".
my $num = eval sprintf('%.3f', $raw_num);
Por ejemplo:
#!/usr/bin/perl
my @num_array = (
0, 1, 1.0, 0.1, 0.10, 0.11, 0.111, 0.1110, 0.1111111
);
for my $raw_num (@num_array) {
my $num = eval sprintf('%.3f', $raw_num);
print $num . "\n";
}
salidas:
0
1
1
0.1
0.1
0.11
0.111
0.111
0.111
Esto le dará la salida que busca,
sub dropTraillingZeros{
$_ = shift;
s/(\d*\.\d{3})(.*)/$1/;
s/(\d*\.\d)(00)/$1/;
s/(\d*\.\d{2})(0)/$1/;
print "$_\n";
}
dropTraillingZeros(0);
dropTraillingZeros(0.1);
dropTraillingZeros(0.11);
dropTraillingZeros(0.111);
dropTraillingZeros(0.11111111);