골랑 부서
오늘 직장에서 Golang으로 된 코드를 읽고 호기심이 생겼습니다.
maxQuerySize := 500
// metricDataQueries is user provided
sliceLength := len(metricDataQueries)/maxQuerySize + 1
// what's the value of sliceLength?
for i := 0; i < sliceLength; i++ {
whatever
}
이것은 단순한 정수 나눗셈이지만 그 결과는 for 루프의 매개변수로 사용됩니다.
정수 나눗셈에는 이 경우 버그가 발생할 수 있는 단점이 있습니다. for 루프 선언의
float
와 같은 나머지는 int
로 변환할 때 잘림이 발생하지 않는 경우에만 지원됩니다(즉, 10.0
가 작동하고, 10.1
don '티).Go는 이것을 어떻게 처리합니까? 대답은 간단합니다. 나머지는 무시하고 결과는 몫입니다. 이런 일이 발생하는 이유는 Go 사양의 Constant expressions에 설명되어 있습니다.
Any other operation on untyped constants results in an untyped constant of the same kind; that is, a boolean, integer, floating-point, complex, or string constant. If the untyped operands of a binary operation (other than a shift) are of different kinds, the result is of the operand's kind that appears later in this list: integer, rune, floating-point, complex.
즉, "진정한"나눗셈을 하려면 최소한 하나의 인수를
float
로 변환해야 합니다.a := 10.0 / 2
b := 10 / 2.0
c := 10.0 / 2.0
d := 10 / 2
fmt.Println(reflect.TypeOf(a)) // float
fmt.Println(reflect.TypeOf(b)) // float
fmt.Println(reflect.TypeOf(c)) // float
fmt.Println(reflect.TypeOf(d)) // int
go.dev/play
정수 나누기를 수행하면 연산 결과가 효과적으로 "바닥"이 됩니다. 우리가 그것의 천장을 원한다면?
Go
math
패키지에는 이에 대한 Ceil(x float64) float64
이 있으며, 이는 "진정한"분할을 수행하고 결과에 적용Ceil
을 의미합니다.이 모든 것이 그다지 놀라운 것은 아니지만 이것이 매우 인체공학적인 방식으로 구현되는 것을 보는 것은 멋진 일입니다.
참고: float 값을 얻으려면 나누기 전에
float
나누기 인수로 변환해야 합니다.이렇게 하십시오:
float64(2) / float64(10) // 0.2
그리고 이렇게 하지 마십시오: a := float64(2 / 10) // 0
.
Reference
이 문제에 관하여(골랑 부서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/endorama/golang-divisions-1nm6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)