2012-05-25 11 views
12

Come si converte una lunga stringa di cifre (50 cifre) in un numero intero in Vai?Utilizzo di valori interi di grandi dimensioni in Vai? (ParseInt converte solo fino a "2147483647"?)

sto ottenendo l'uscita per il codice qui sotto:

number = 2147483647 

err = strconv.ParseInt: parsing "37107287533902102798797998220837590246510135740250 ": valore fuori campo

Sembra di essere in grado per convertire solo numeri fino a 2147483647.

package main 

import "fmt" 
import "io/ioutil" 
import "strings" 
import "strconv" 

var (
     number int64 
) 

func main() { 
    fData,err := ioutil.ReadFile("one-hundred_50.txt") 
    if err != nil { 
      fmt.Println("Err is ",err) 
     } 
    strbuffer := string(fData) 
    lines := strings.Split(strbuffer, "\n") 

    for i, line := range lines { 
     fmt.Printf("%d: %s\n", i, line) 
     number, err := strconv.Atoi(line) 
     fmt.Println("number = ", number) 
     fmt.Println("err = ", err) 
    } 
} 
+4

In genere i numeri interi sono memorizzati in 4 o 8 byte. Questo non è abbastanza vicino per memorizzare 50 cifre e 2147483647 corrisponde a (2^31-1), che è precisamente il limite di un intero con complemento a due firmato memorizzato in 4 byte (o, più precisamente, 32 bit). Verifica se Go ha un tipo "Big Integer". –

risposta

26

Si desidera il pacchetto math/big, che fornisce un supporto intero di precisione arbitraria.

import "math/big" 

func main() { 
    // ... 
    for i, line := range lines { 
     bi := big.NewInt(0) 
     if _, ok := bi.SetString(line, 10); ok { 
      fmt.Printf("number = %v\n", bi) 
     } else { 
      fmt.Printf("couldn't interpret line %#v\n", line) 
     } 
    } 
} 

Ecco un quick example di lavoro.

Problemi correlati