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