web-dev-qa-db-ja.com

golang-phpのようなceil関数?

整数除算以上の最小の整数値を返したい。そのため、math.ceilを使用しましたが、必要な値を取得できません。

package main

import (
    "fmt"
    "math"
)

func main() {
    var pagesize int = 10
    var length  int = 43

    d := float64(length / pagesize)
    page := int(math.Ceil(d))

    fmt.Println(page)
    // output 4 not 5
}

http://golang.org/pkg/math/#Ceil

http://play.golang.org/p/asHta1HkO_

なにが問題ですか?ありがとう。

18
leiyonglin

この線

_d := float64(length / pagesize)
_

除算の結果を浮動させるように変換します。除算自体は整数除算であるため、結果は4になります。したがって、d = 4.0であり、math.Ceil(d)は4です。

行を次のように置き換えます

_d := float64(length) / float64(pagesize)
_

_d=4.3_とint(math.Ceil(d))=5があります。

35
damienfrancois

分割前に長さとページサイズを浮動小数点数に変換します。

d := float64(length) / float64(pagesize)

http://play.golang.org/p/FKWeIj7of5

9
lnmx

使用できることに注意してください

x, y := length, pagesize
q := (x + y - 1) / y;

x >= 0およびy > 0の場合。また、非常に高速になります。

または、x+yのオーバーフローを回避するには:

q := 1 + (x - 1) / y

これはC++バージョンと同じです: C/C++での整数除算の高速上限

4
Jendas

余りをチェックして、次の整数に上げる必要があるかどうかを確認できます。

page := length / pagesize
if length % pagesize > 0 {
    page++
}
1
Matt Bajorek