2017-04-08 1 views
-2

Go에서 int64의 큰 값에 대해 누승 및 나누기와 같은 연산을 수행해야하지만 오버플로 문제가 있습니다. float64로 변환하려고 시도했지만 다른 문제가 발생합니다. 여기 내가 시도한 것이있다.Go에서 큰 정수를 사용하는 방법?

저는 정수 변수를 가지고 있습니다.이 변수는 편리한 수학 패키지 (https://golang.org/pkg/math)를 사용하기 위해 float64로 형 변환해야했습니다.

그러나 정수 변수가 너무 큰 경우 올바르게 캐스팅되지 않습니다. 크기가 float64보다 크기 때문에 가정합니다. 예 :

fmt.Printf("%f",float64(111111111111111110)) //Outputs 111111111111111104.000000 

저는 math.Mod, math.Pow10 및 math.Log10을 사용하려고합니다. 위의 그림과 같이 많은 수의 논리를 사용하면 어떻게 할 수 있습니까?

int(math.Mod(float64(123)/math.Pow10(1),10))) // Gets the second digit 
+0

가능한 : 여기 INT64의 n 번째 진수를 추출하는 데 사용하는 방법입니다 왜 부동 소수점 숫자가 부정확합니까?] (http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) –

+0

OP는 부동에 대해 물어 보려하지 않았습니다. 어쨌든, 그것은 그 질문의 중복이 아닙니다. – Zoyd

답변

3

질문은 분명하지 않지만 큰 정수에서 작업을 수행하려는 경우 float64 만 사용해보십시오.

이 경우 올바른 도구는 math/big package입니다.

// first digit is n=0 
func nthDigit(i int64, n int64) int64 { 
    var quotient big.Int 
    quotient.Exp(big.NewInt(10), big.NewInt(n), nil) 

    bigI := big.NewInt(i) 
    bigI.Div(bigI, &quotient) 

    var result big.Int 
    result.Mod(bigI, big.NewInt(10)) 

    return result.Int64() 
} 
+0

질문에 대한 불쾌한 표현으로 유감스럽게 생각하지만 사용하기 적합한 패키지를 알려 주셔서 감사합니다! 나는이 패키지에 로그 기능이 없다는 것을 알아 차렸는데, 이것 또한 큰 int (예를 들어 i의 숫자를 얻으려면)로 할 수 있습니까? – WCGPR0

+1

실제로 Log가 없지만 BitLen이 있고 lb (n) = BitLen (n) -1 (lb = 이진 대수)입니다. 거기에서 Log (n) = lb (n)/lb (10). – Zoyd

+0

질문을 편집하여 질문 한 내용을 반영합니다. 이렇게하면이 질문을 나중에 쉽게 찾을 수 있습니다. 물론 내 편집 내용이 당신이 말하고자하는 바가 아니었다면 편집 할 수 있습니다. – Zoyd

2
당신은 변환 된 문자열에서 숫자를 문자열로 INT로 변환 한 다음 가져 오기 위해 시도 할 수

,

// n >= 1 
func NthDigit(num int, n int) int { 
    return int(strconv.Itoa(num)[n-1]) - int('0') 
} 
관련 문제