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 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 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 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 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++

    点赞 评论 复制链接分享

相关推荐