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

如何在Go中测试浮点是否为整数?,go,modulus,Go,Modulus,我最初尝试过这个,但是没有为float64定义%运算符 func main(){ var a float64 a = 1.23 if a%1 == 0{ fmt.Println("yay") }else{ fmt.Println("you fail") } } 假设您的数字符合int64,您可以将浮点值与转换后的整数值进行比较,看看它们是否相同: if a == float64(int64(a)) { fmt.Pr

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

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

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

if a == float64(int64(a)) {
    fmt.Println("yay")
} else {
    fmt.Println("you fail")
}
否则,您可以使用
math.Trunc
函数detailed,例如:

if a == math.Trunc(a) {
    fmt.Println("yay")
} else {
    fmt.Println("you fail")
}
if a.Trunc() == a {
    // ...
}
这个应该在整个
float64
域中工作。

怎么样?它将
float64
截断为其整数分量

例如,类似于:

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

请注意有关浮点表示限制的常见注意事项。您可能希望检查
a.Trunc()
是否在
a
的某个小范围内,以说明
1.0000000000000000 2
之类的值。我认为以下代码可能有用

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")
    }
}
您可以使用以下功能:

const epsilon = 1e-9 // Margin of error
if _, frac := math.Modf(math.Abs(a)); frac < epsilon || frac > 1.0 - epsilon {
    // ...
}
Modf返回整数和分数浮点数,其和为f。两个值的符号都与f相同

我是这样解决的:

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

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

这似乎不是一个类型正确的Go表达式。Go坚持认为
==
的两个操作数的类型完全相同。事实上,在尝试过它之后,由于上述原因,它被拒绝为类型不正确。首先,我们需要回溯到float。与Deepu的答案一样,当表达式的整数部分超过2^63时,这将失败@TimStClair和@Gian有这个想法(保持它为浮点,但使用
math
来分隔整数和小数部分)。@twoo,是的,它会的。这就是为什么我有一点关于它适用于int64范围内的数字,以及为什么我提供了一个指向truncate函数的链接,用于希望使用完整范围的情况。我不确定你是否错过了最后一段,如果你有一个问题没有在anwser中涉及,或者如果我误解了(完全可能),请让我知道,我会尽力纠正。哦,对不起,我错过了最后一句。铸造仍然不是我所建议的,我甚至没有详细说明它的问题,但是是的,我的评论是多余的。这里似乎有溢出
b
的危险?问题是
a
是一个
float64
被强制为
int
,此时它可能溢出(32位)
int
键入并导致奇怪的精度损失(或者实际上是假阴性)。仍然会溢出,例如1e30,刚才溢出在计算
b
时使用的临时值中。Gian和Tim St.Clair的答案似乎就是这个方法(Tim编写并展示了如何处理舍入错误,所以这是我的选择)。因为我会使用
Modf
,但检查数字是否接近整数。否则,
float64(.3)+float64(.6)+float64(.1)
将被视为非整数。(注意,该示例“坏”浮点值中的类型对于查看问题是必需的,因为Go。)看起来很接近,但它是
math.Trunc(a)
而不是
a.Trunc()
。如果a:=math.Trunc(a)-a,则整个校正的
if
类似于
if aa:=math.Trunc(a)-a;aa<1e-5&&aa>-1e-5{…}
答案不完整。