Go의 부동 소수점 번호를 이해한다는 것
Emily Parker
Product Engineer · Leapcell

Key Takeaways
- Go는
float32
와float64
를 제공하며, 정밀도를 위해float64
가 선호됩니다. - 부동 소수점 연산은 이진 표현으로 인해 정밀도 오류를 일으킬 수 있습니다.
- 정확한 값이 필요한 중요한 계산에는
decimal
과 같은 정밀 라이브러리를 사용하십시오.
부동 소수점 숫자는 특히 소수 부분을 갖는 실수를 나타내는 프로그래밍에서 필수적입니다. Go에서 이러한 숫자가 어떻게 표현되고 조작되는지 이해하는 것은 정확하고 효율적인 계산에 매우 중요합니다.
Go의 부동 소수점 유형
Go는 두 가지 주요 부동 소수점 유형인 float32
와 float64
를 제공합니다. 이러한 유형은 최신 CPU에서 널리 지원되는 부동 소수점 연산에 대한 IEEE-754 표준을 따릅니다. 단정밀도로도 알려진 float32
유형은 4바이트를 차지하며 약 6자리의 10진수 정밀도를 제공합니다. 반면에 배정밀도인 float64
는 8바이트를 차지하며 약 15자리의 10진수 정밀도를 제공합니다.
이러한 유형이 나타낼 수 있는 값의 범위는 광대합니다. 예를 들어 float32
의 최대값은 약 3.4e38이고 float64
의 경우 약 1.8e308입니다. 이러한 범위를 통해 Go는 매우 크고 작은 숫자를 효과적으로 처리할 수 있습니다.
정밀도 및 표현
부동 소수점 숫자는 광범위한 값을 나타낼 수 있지만 정밀도에 제한이 있습니다. 예를 들어 모든 10진수 분수를 이진 형식으로 정확하게 나타낼 수 없으므로 잠재적인 정밀도 문제가 발생합니다. 고전적인 예는 이진수로 정확하게 나타낼 수 없는 숫자 0.1이며, 이로 인해 작은 표현 오류가 발생합니다.
다음 Go 코드를 고려하십시오.
package main import "fmt" func main() { a := 0.1 b := 0.2 c := a + b fmt.Println(c) // Expected 0.3, but outputs 0.30000000000000004 }
이 예에서 0.1과 0.2를 더하면 이진 부동 소수점 표현의 고유한 제한으로 인해 정확한 결과 0.3이 생성되지 않습니다.
정밀도 문제 처리
특히 정확성이 가장 중요한 금융 계산에서 정밀도 문제를 완화하기 위해 개발자는 decimal
패키지를 사용할 수 있습니다. 이 패키지는 임의 정밀도 고정 소수점 10진수 숫자를 제공하여 이진 부동 소수점 연산의 함정 없이 10진수 숫자를 정확하게 표현하고 조작할 수 있습니다.
다음은 decimal
패키지를 사용하는 방법입니다.
package main import ( "fmt" "github.com/shopspring/decimal" ) func main() { a := decimal.NewFromFloat(0.1) b := decimal.NewFromFloat(0.2) c := a.Add(b) fmt.Println(c) // Outputs 0.3 }
decimal
패키지를 활용하면 0.1과 0.2의 덧셈은 예상대로 0.3의 결과를 생성하여 계산의 정밀도를 보장합니다.
모범 사례
-
float32
보다float64
선호: 더 높은 정밀도와 넓은 범위로 인해 메모리 제약 조건이 없는 한 일반적으로float64
가 선호됩니다. -
동등성 비교에 주의: 부동 소수점 숫자를 직접 비교하면 정밀도 문제로 인해 예기치 않은 결과가 발생할 수 있습니다. 대신 숫자가 서로 작은 엡실론 값 내에 있는지 확인하는 것이 좋습니다.
-
중요한 계산에 정밀 라이브러리 활용: 금융 소프트웨어와 같이 정확한 10진수 표현이 필요한 애플리케이션의 경우
decimal
과 같은 라이브러리를 사용하여 부동 소수점 연산의 함정을 피하십시오.
결론
Go에서 부동 소수점 숫자의 복잡성을 이해하는 것은 안정적이고 정확한 애플리케이션을 개발하는 데 매우 중요합니다. 이진 표현의 제한 사항을 인식하고 적절한 전략을 사용함으로써 개발자는 정밀도를 효과적으로 관리하고 계산의 정확성을 보장할 수 있습니다.
FAQs
Go의 부동 소수점 숫자는 IEEE-754를 따르며 일부 10진수 분수는 이진수로 정확하게 표현할 수 없어 정밀도 오류가 발생합니다.
메모리 제약 조건이 중요한 경우에만 float32
를 사용하십시오. 정밀도가 낮고 범위가 float64
보다 작기 때문입니다.
decimal
과 같은 타사 라이브러리를 사용하여 정확한 10진수 정밀도가 필요한 산술 연산을 처리하십시오.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하십시오. 요청이나 요금이 없습니다.
타의 추종을 불허하는 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있는 자동 확장.
- 운영 오버헤드가 없으므로 빌드에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ