30

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

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

5 回答 5

35

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

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

否则,您可以使用此处math.Trunc详述的功能,例如:

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

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

于 2013-05-14T04:01:52.300 回答
4

您可以使用以下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 具有相同的符号。

于 2016-02-02T21:21:30.607 回答
0

math.Trunc怎么样?它将 a 截断float64为其整数部分。

例如,类似:

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

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

于 2013-05-14T04:01:54.367 回答
0

我这样解决了:

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

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

于 2018-12-12T19:57:08.553 回答
-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")
    }
}
于 2013-05-14T04:06:12.827 回答