> 백엔드 개발 > Golang > Go에서 float64를 uint64로 안전하게 변환하는 방법은 무엇입니까?

Go에서 float64를 uint64로 안전하게 변환하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-15 02:44:10
원래의
205명이 탐색했습니다.

How to Safely Convert float64 to uint64 in Go?

float64를 uint64로 올바르게 변환

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿