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_

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


person leiyonglin    schedule 10.11.2013    source источник


Ответы (4)


Линия

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.

person damienfrancois    schedule 10.11.2013
comment
Нет! просто преобразование первого операнда важно и определяет. - person S.M.Mousavi; 26.03.2020

Преобразуйте длину и размер страницы в числа с плавающей запятой перед разделением:

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

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

person lnmx    schedule 10.11.2013

Избегание операций с плавающей запятой (для производительности и ясности):

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

для x >= 0 и y > 0.

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

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

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

person Jendas    schedule 02.01.2019
comment
Стоит отметить, что (по крайней мере, на моем MacBook Pro 2014 года с i7 2,5 ГГц) это только примерно на 17% быстрее, чем решение float64 / math.Ceil, и только с 32-битными целыми числами - с int64 оно примерно на 24% медленнее. Тест здесь - хотя он на самом деле не работает на игровой площадке Go, я думаю, b / c у него нет достаточного разрешения по времени. Тем не менее, для ясности я все еще использую этот ответ в своем коде. - person David Moles; 13.02.2019

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

page := length / pagesize
if length % pagesize > 0 {
    page++
}
person Matt Bajorek    schedule 23.06.2018