我最初尝试过这个,但是没有为 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
详述的功能,例如:
if a == math.Trunc(a) {
fmt.Println("yay")
} else {
fmt.Println("you fail")
}
那应该在整个float64
域内工作。
您可以使用以下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 具有相同的符号。
math.Trunc怎么样?它将 a 截断float64
为其整数部分。
例如,类似:
if a.Trunc() == a {
// ...
}
请注意有关浮点表示限制的常见注意事项。您可能希望检查 是否a.Trunc()
在 的某个小范围内a
,以考虑诸如 之类的值1.00000000000000002
。
我这样解决了:
isWhole := int(value * 100) == int(value) * 100
调整因子中的位数,例如乘以 10000 以检查 4 位数。
我认为以下代码可能有用,
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")
}
}