【问题标题】:Using big integer values in Go? (ParseInt only converts up to "2147483647"?)在 Go 中使用大整数值? (ParseInt 最多只能转换为“2147483647”?)
【发布时间】:2012-05-25 01:32:23
【问题描述】:

Go 中如何将一长串数字(50 位)转换为整数?

我得到以下代码的输出:

number = 2147483647

错误 = strconv.ParseInt:解析“37107287533902102798797998220837590246510135740250 ": 值超出范围

它似乎只能将数字转换为 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 或 8 个字节存储。这不足以存储 50 位数字,并且 2147483647 对应于 (2^31-1),这正是存储在 4 个字节(或更准确地说,32 位)中的有符号二进制补码整数的限制。看看 Go 是否有“大整数”类型。

标签: go


【解决方案1】:

您需要math/big 包,它提供任意精度整数支持。

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)
        }
    }
}

这是一个 quick example 的工作。

【讨论】:

  • 如何对这些数字进行算术运算?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2021-07-24
  • 2020-02-05
相关资源
最近更新 更多