이 두 float64의 값이 다른 이유는 무엇입니까?
소개
floating으로 작업할 때 -포인트 숫자의 경우 정밀도 제한을 이해하는 것이 중요합니다. 다음 Go 코드를 고려하세요.
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
(Go Playground 링크)
두 번째 줄은 부동 소수점 정밀도로 인해 "9.120000000000001"이라는 예상 결과를 생성합니다.
질문
그러나 첫 번째 줄에는 후행 정밀도 없이 "9.12"가 인쇄됩니다. 이는 질문을 제기합니다. Go는 왜 유형이 지정되지 않은 두 상수에 대해 부동 소수점 곱셈을 수행한 다음 이를 9.12 리터럴로 변환하지 않습니까?
답변
에 따르면 Go 언어 사양에서는 상수 표현식이 정확하게 평가됩니다. 따라서 "912 * 0.01"은 정확하게 평가되며 이는 "9.12"와 동일합니다.
첫 번째 피연산자를 float64(float64(912))로 캐스팅하면 다른 피연산자(0.01)도 암시적으로 float64로 유형 변환됩니다. 0.01은 float64에서 정확하게 표현할 수 없으므로 첫 번째 예와 다른 위치에서 정밀도가 손실됩니다. 이는 다양한 입력 표현식과 함께 fmt.Println()을 사용할 때 관찰되는 다양한 결과를 설명합니다.
위 내용은 Go에서 유형이 지정되지 않은 부동 소수점 곱셈과 유형이 지정된 부동 소수점 곱셈이 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!