2010-09-05 18 views
10

bien, así que estoy empezando en scala ... encontré un problema extraño con un número grande.scala no tomará un entero de 12 dígitos

import Math._ 
var num:Long=0 
num+=600851475 
num*=1000 
println(num) 

que el código funciona bien, pero el siguiente no se compila con un error diciendo que el número entero es demasiado grande.

import Math._ 
var num:Long=0 
num+=600851475000 
println(num) 

¿Qué tal? ¿Scala no puede manejar un número de 12 dígitos? :/

+1

¿Quizás debería usar un entero largo literal (con el sufijo 'L')? es decir, '600851475000L' –

Respuesta

9

Sin L (o l) sufijo, el valor del literal se trata como un int de 32 bits.

14

Aunque num se declara a ser una larga, 600851475000 es leído por el compilador para ser un Int, que sólo puede manejar números en [-2^32, 2^32)[-2^31, 2^31). Escribir el número como 600851475000L le dice al compilador que lo trate como un Long, que manejará números de hasta 18 dígitos.

+0

El rango de Int es en realidad [-2^31, 2^31), pero el punto es correcto en el objetivo. –

+3

Para representar con precisión números que incluso Long no puede manejar, hay scala.BigInt (en la biblioteca estándar). Todavía no puede escribir literales de 37 dígitos, pero BigInt puede construirse a partir de una cadena, por lo que puede simularlo (simplemente ajuste el literal de 37 dígitos entre comillas). –

+0

@Rex Kerr - ¡Gracias por atrapar eso! –

Cuestiones relacionadas