골랑 부서

4606 단어 gomathtodayilearned
사진 제공: Chris Liverani on Unsplash

오늘 직장에서 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

정수 나누기를 수행하면 연산 결과가 효과적으로 "바닥"이 됩니다. 우리가 그것의 천장을 원한다면?

Gomath 패키지에는 이에 대한 Ceil(x float64) float64 이 있으며, 이는 "진정한"분할을 수행하고 결과에 적용Ceil을 의미합니다.

이 모든 것이 그다지 놀라운 것은 아니지만 이것이 매우 인체공학적인 방식으로 구현되는 것을 보는 것은 멋진 일입니다.

참고: float 값을 얻으려면 나누기 전에 float 나누기 인수로 변환해야 합니다.

이렇게 하십시오: float64(2) / float64(10) // 0.2 그리고 이렇게 하지 마십시오: a := float64(2 / 10) // 0 .

좋은 웹페이지 즐겨찾기