如何在Go中测试浮点是否为整数?
我最初尝试过这个,但是没有为float64定义%运算符如何在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
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{…}
答案不完整。