如何在Go中测试浮点数是否为整数?

时间:2013-05-14 03:51:51

标签: go modulus

我最初尝试过这个,但%operator运算符没有为float64定义。

func main(){
    var a float64
    a = 1.23
    if a%1 == 0{
        fmt.Println("yay")
    }else{
        fmt.Println("you fail")
    }
}

5 个答案:

答案 0 :(得分:17)

假设您的数字适合int64,您只需将浮点值与转换后的整数值进行比较,看看它们是否相同:

if a == float64(int64(a)) {
    fmt.Println("yay")
} else {
    fmt.Println("you fail")
}

否则,您可以使用math.Trunc详细here功能,例如:

if a == math.Trunc(a) {
    fmt.Println("yay")
} else {
    fmt.Println("you fail")
}

那个应该在整个float64域内工作。

答案 1 :(得分:3)

您可以使用math.Modf功能:

const epsilon = 1e-9 // Margin of error
if _, frac := math.Modf(math.Abs(a)); frac < epsilon || frac > 1.0 - epsilon {
    // ...
}
此处需要

epsilon,因为浮点数学不精确(例如float64(.3)+float64(.6)+float64(.1) != 1

来自godoc:

func Modf(f float64) (int float64, frac float64)
     

Modf返回总和为f的整数和小数浮点数。两个值都与f具有相同的符号。

答案 2 :(得分:1)

math.Trunc怎么样?它会将float64截断为整数组件。

例如:

if a.Trunc() == a {
    // ...
}

请注意有关浮点表示限制的常见注意事项。您可能希望检查a.Trunc()是否在a的某个小范围内,以便考虑1.00000000000000002等值。

答案 3 :(得分:0)

我这样解决了它:

isWhole := int(value * 100) == int(value) * 100

调整系数中的位数,例如乘以10000以检查4位数字。

答案 4 :(得分:-1)

我认为以下代码可能有用,

func main(){
    var (
          a float64
          b float64
          c float64
    ) 
    a = 1.23
    b = float64(int64(a))
    c = a - b
    if c > 0 {
        fmt.Println("Not a Whole Number")
    } else {
        fmt.Println("Whole Number")
    }
}