2011-11-05 6 views
48

float64를 Go에서 int로 변환하는 방법은 무엇입니까? strconv 패키지는 문자열을 변환하거나 문자열을 변환하는 데 사용할 수 있지만 하나가 문자열이 아닌 데이터 형식 간에는 사용할 수 없다는 것을 알고 있습니다. 나는 fmt.Sprintf을 사용하여 문자열로 변환 한 다음 strconv 데이터 유형으로 변환 할 수 있지만이 추가 변환은 조금 어색해 보입니다. 더 좋은 방법은이 방법이 있습니까? 간단하게 int로 캐스팅float64를 Go의 int로 변환

답변

95
package main 
import "fmt" 
func main() { 
    var x float64 = 5.7 
    var y int = int(x) 
    fmt.Println(y) // outputs "5" 
} 
+1

정말 간단했는지 몰랐습니다. - 고마워요! –

+0

@David Grayson, 그래서이 변환은 Math.Floor (x)와 동일합니까? 아니면 float64가 메모리에 저장하는 방식 때문에 .7을 삭제합니까? –

+1

@DavidLarsen Go 사양에서 : "부동 소수점 숫자를 정수로 변환 할 때 분수는 무시됩니다 (제로쪽으로 절단)". ([Go spec] (http://golang.org/ref/spec#Conversions) – kvu787

0

시스템의 경우 내부적으로 2.0 1.9999999999로, 당신은 당신이 무엇을 기대하지 않습니다 나타내는 플로트를 자릅니다. 다양한 printf 변환은이 문제를 처리하고 변환 할 때 번호를 올바르게 반올림합니다.

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    floats := []float64{1.9999, 2.0001, 2.0} 
    for _, f := range floats { 
     t := int(f) 
     s := fmt.Sprintf("%.0f", f) 
     if i, err := strconv.Atoi(s); err == nil { 
      fmt.Println(f, t, i) 
     } else { 
      fmt.Println(f, t, err) 
     } 
    } 
} 

코드를 Go Playground

4

에 그 단순히 int로 float64에서,이

package main 

import (
    "fmt" 
) 

func main() { 
    nf := []float64{-1.9999, -2.0001, -2.0, 0, 1.9999, 2.0001, 2.0} 

    //round 
    fmt.Printf("Round : ") 
    for _, f := range nf { 
     fmt.Printf("%d ", round(f)) 
    } 
    fmt.Printf("\n") 

    //rounddown ie. math.floor 
    fmt.Printf("RoundD: ") 
    for _, f := range nf { 
     fmt.Printf("%d ", roundD(f)) 
    } 
    fmt.Printf("\n") 

    //roundup ie. math.ceil 
    fmt.Printf("RoundU: ") 
    for _, f := range nf { 
     fmt.Printf("%d ", roundU(f)) 
    } 
    fmt.Printf("\n") 

} 

func roundU(val float64) int { 
    if val > 0 { return int(val+1.0) } 
    return int(val) 
} 

func roundD(val float64) int { 
    if val < 0 { return int(val-1.0) } 
    return int(val) 
} 

func round(val float64) int { 
    if val < 0 { return int(val-0.5) } 
    return int(val+0.5) 
} 
를 작동해야하는 경우 : 그래서 더 정확한 값을 얻기 위해, 변환이 처음 예상했던 것보다 훨씬 더 복잡하다

출력 : 여기에

Round : -2 -2 -2 0 2 2 2 
RoundD: -2 -3 -3 0 1 2 2 
RoundU: -1 -2 -2 0 2 3 3 

는 놀이터의 코드입니다 - 012,336,