Go에서 float64 숫자를 uint64로 변환하려고 하면 정밀도 문제가 발생할 수 있습니다. 변환 중에 float64의 분수 구성 요소가 삭제되므로 예상치 못한 동작이 발생하는 경우가 많습니다.
문제를 설명하려면:
package main import "fmt" func main() { var n float64 = 6161047830682206209 fmt.Println(uint64(n)) }
이 코드는 다음과 같은 잘못된 값을 인쇄합니다.
6161047830682206208
문제
문제의 근원 Go에서 상수와 부동 소수점 숫자가 표현되는 방식의 차이점에 있습니다. 상수는 임의의 정밀도로 표현되는 반면 부동 소수점 숫자는 IEEE 754 표준을 따릅니다. 즉, 상수는 정밀도 손실 없이 값을 나타낼 수 있지만 부동 소수점 숫자는 숫자를 저장하는 데 사용할 수 있는 비트 수가 제한되어 있습니다(float64의 경우 53).
해결책
float64를 uint64로 올바르게 변환하려면 float64 숫자가 사용 가능한 52비트 내에서 정확하게 표현될 수 있는지 확인해야 합니다. 그렇지 않으면 정밀도가 손실됩니다. float64 값이 uint64의 표현 가능한 범위 내에 있는지 확인하면 됩니다.
다음은 캐스팅하기 전에 표현성을 확인하는 함수의 예입니다.
func Float64ToUint64(n float64) (uint64, error) { if (n < 0) || (n > math.MaxUint64) { return 0, errors.New("value out of range") } return uint64(n), nil }
위 내용은 Go에서 float64를 uint64로 안전하게 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!