Golang - функция ceil как php?

Я хочу вернуть наименьшее целочисленное значение, большее или равное целочисленному делению. Поэтому я использовал 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_

Что не так? Спасибо.

Ответ 1

Линия

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.

Ответ 2

Преобразовать длину и размер листа в поплавки перед делением:

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

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

Ответ 3

Обратите внимание, что вы можете использовать

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

для x >= 0 и y > 0. Это также будет очень быстро.

Или чтобы избежать переполнения x+y:

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

То же, что и версия C++: Быстрый потолок целочисленного деления в C/C++

Ответ 4

Вы можете проверить остаток, чтобы увидеть, должно ли оно быть увеличено до следующего целого числа.

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