Bienvenido a los foros de Perl en Español, hreyes.
Perl es un poco especial en el trabajo con números... solo hay que leer
perlnumber o
bignum.
A veces hace cosas raras...
En mi máquina, que es un 64 bits, no tengo problemas para representar números de hasta 19 dígitos:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
my $i = 18_446_744_073_709_551_606; # 2**64 -10
for (0..19) {
say $i++;
}
__END__
18446744073709551606
18446744073709551607
18446744073709551608
18446744073709551609
18446744073709551610
18446744073709551611
18446744073709551612
18446744073709551613
18446744073709551614
18446744073709551615
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
1.84467440737096e+19
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí, solo hacemos la operación matemática de incrementar. En cuanto superamos el límite de 2**64-1, lo convierte a punto flotante. Lo mismo si hubiera realizado cualquier otra operación matemática, como por ejemplo,
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
my $i = 2**64 -10;
for (0..19) {
say $i++;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Deberíamos tener la misma salida, pero no es así: la salida es solo de enteros si es de menos de 16 dígitos.
La solución, de momento, es la que te comenta hreyes. Con printf o sprintf y con "%.0f" sacamos las cifras sin la parte decimal.
Si necesitas manejar cifras más grandes (pero muy, muy, muy grandes), puedes usar
bignum, que a su vez cargará Math::BigFloat y Math::BigInt. Serán los cálculos un poco más lentos, pero podrás manejar números muy largos.