###### doufu2396
2013-11-10 14:35 阅读 66

# golang-ceil函数像php？

I want to return the least integer value greater than or equal to integer division. So I used `math.ceil`, but can not get the value I want.

``````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_

What is wrong? Thanks.

• 点赞
• 写回答
• 关注问题
• 收藏
• 复制链接分享

#### 4条回答默认 最新

• 已采纳
douxu3732 2013-11-10 14:49

The line

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

transforms to float the result of the division. Since the division itself is integer division, it results in 4, so d = 4.0 and `math.Ceil(d)` is 4.

Replace the line with

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

and you'll have `d=4.3` and `int(math.Ceil(d))=5`.

点赞 评论 复制链接分享
• duanqiao0153 2013-11-10 14:50

Convert length and pagesize to floats before the division:

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

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

点赞 评论 复制链接分享
• duan5801 2018-06-23 02:17

You can check the remainder to see if it should be raised to the next integer.

``````page := length / pagesize
if length % pagesize > 0 {
page++
}
``````
点赞 评论 复制链接分享
• doufu7835 2019-01-02 12:07

Note that you can use

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

for `x >= 0` and `y > 0`. It's also going to be very fast.

Or to avoid overflow of `x+y`:

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

It's the same as the C++ version: Fast ceiling of an integer division in C / C++

点赞 评论 复制链接分享