Float64에서 Uint64로 변환 이해
Go에서 float64를 uint64로 변환하려면 float64를 uint64 데이터 유형으로 캐스팅해야 합니다. 표현의 차이로 인해 예상치 못한 동작이 발생할 수 있습니다.
고려하세요. 다음 예는 다음과 같습니다.
package main func main() { n := float64(6161047830682206209) println(uint64(n)) }
출력은 다음과 같습니다.
6161047830682206208
uint64 값이 float64와 동일할 것으로 예상할 수 있으므로 이는 직관에 반하는 것 같습니다. 불일치는 이러한 데이터 유형의 내부 표현에서 비롯됩니다.
상수 및 부동 소수점 숫자
Go의 상수는 임의의 정밀도로 표현되는 반면 부동 소수점 숫자는 임의의 정밀도로 표현됩니다. IEEE 754 표준을 따릅니다.
IEEE 754에서는 배정밀도 부동 소수점 숫자 (64비트)는 숫자용으로 53비트를 예약합니다. 주어진 예에서:
6161047830682206209
숫자가 53비트 정수로 표현 가능한 최대 수를 초과합니다:
2^52 : 9007199254740992
따라서 상수는 float64로 정확하게 표현될 수 없습니다. 로 변환하는 동안 숫자가 손실됩니다. uint64.
확인
이것은 원래 float64 값을 인쇄하여 확인할 수 있습니다.
fmt.Printf("%f\n", n) fmt.Printf("%d\n", uint64(n))
이 결과는 다음과 같습니다.
6161047830682206208.000000 6161047830682206208
문제는 변환 자체에 있는 것이 아니라 float64를 사용했을 때 정밀도가 손실되는 데 있습니다. 원래 표현의 한계로 인해 할당되었습니다.
유효한 변환의 예
53비트를 사용하여 정확하게 표현할 수 있는 더 작은 숫자의 경우:
n := float64(7830682206209) fmt.Printf("%f\n", n) fmt.Printf("%d\n", uint64(n))
출력은 다음과 같습니다.
7830682206209.000000 7830682206209
이 경우 float64는 정밀도 손실 없이 정확하게 표현되고 uint64로 변환됩니다.
위 내용은 정밀도 손실은 Go의 float64에서 uint64로의 변환에 어떤 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!