> 백엔드 개발 > Golang > Go의 `912 * 0.01`이 `float64(912) * 0.01`과 다른 이유는 무엇입니까?

Go의 `912 * 0.01`이 `float64(912) * 0.01`과 다른 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-16 19:00:15
원래의
571명이 탐색했습니다.

Why Does `912 * 0.01` Differ from `float64(912) * 0.01` in Go?

Float64 정밀도의 차이점: 다양한 값 압축 풀기

Go에서 다음 예를 고려하세요.

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
로그인 후 복사

첫 번째 명령문은 9.12를 인쇄하고 두 번째 결과는 9.120000000000001. 이러한 정밀도의 명백한 차이는 혼란스러울 수 있습니다.

Go 언어 사양에 따르면 상수 표현식은 정확하게 평가됩니다. 이 경우 912 * 0.01은 상수 표현식입니다. 이를 정확하게 평가하면 9.12가 생성되며, 이후에 float64(912 * 0.01)에 할당되고 fmt.Println()에 전달됩니다.

또는 float64(912) * 0.01도 상수 표현식입니다. 그러나 원래 정수였던 왼쪽 피연산자는 곱하기 전에 명시적으로 float64로 캐스팅됩니다. 즉, 0.01도 암시적으로 float64로 변환되어 두 float64 값이 곱해집니다.

결정적으로 0.01은 float64로 정확하게 표현할 수 없습니다. 표현 가능한 가장 가까운 값으로 반올림되므로 약간의 부정확성이 발생합니다. 결과적으로 float64(912) * 0.01은 9.120000000000001로 평가된 후 인쇄됩니다.

요약하면 출력의 차이는 상수 표현식의 평가에서 발생합니다. 즉, 캐스트가 평가 전 또는 평가 중에 발생하는지, float64 정밀도의 한계로 인해 부정확성이 발생하는지 여부.

위 내용은 Go의 `912 * 0.01`이 `float64(912) * 0.01`과 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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