英文:
How to test whether a float is a whole number in Go?
问题
我最初尝试了这个,但是%运算符对于float64类型没有定义。
func main(){
var a float64
a = 1.23
if a%1 == 0{
fmt.Println("yay")
}else{
fmt.Println("you fail")
}
}
英文:
I originally tried this, however the % operator isn't defined for float64.
func main(){
var a float64
a = 1.23
if a%1 == 0{
fmt.Println("yay")
}else{
fmt.Println("you fail")
}
}
答案1
得分: 39
假设你的数字适合int64
,你可以将浮点值与转换后的整数值进行比较,看它们是否相同:
if a == float64(int64(a)) { ... }
或者,如果你需要整个float64
的范围,你可以使用math.Trunc函数,像这样:
if a == math.Trunc(a) { ... }
例如,以下代码在Go Playground上的测试中正确输出yay
:
package main
import (
"fmt"
"math"
)
func main() {
var a float64 = 2.00
if a == math.Trunc(a) {
fmt.Println("yay")
} else {
fmt.Println("you fail")
}
}
英文:
Assuming that your numbers will fit into an int64
, you can compare the float value with a converted integer value to see if they're the same:
if a == float64(int64(a)) { ... }
Alternatively, if you need the entire float64
domain, you can use the math.Trunc
function, with something like:
if a == math.Trunc(a) { ... }
For example, the following code correctly outputs yay
, on testing over at the Go playground:
package main
import (
"fmt"
"math"
)
func main() {
var a float64 = 2.00
if a == math.Trunc(a) {
fmt.Println("yay")
} else {
fmt.Println("you fail")
}
}
答案2
得分: 5
你可以使用math.Modf
函数:
const epsilon = 1e-9 // 误差范围
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具有相同的符号。
英文:
You can use the math.Modf
function:
const epsilon = 1e-9 // Margin of error
if _, frac := math.Modf(math.Abs(a)); frac < epsilon || frac > 1.0 - epsilon {
// ...
}
epsilon
is necessary here since floating point math is not precise (e.g. float64(.3)+float64(.6)+float64(.1) != 1
)
From the godoc:
> func Modf(f float64) (int float64, frac float64)
> Modf returns integer and fractional floating-point numbers that sum to f. Both values have the same sign as f.
答案3
得分: 0
如何使用 math.Trunc?它可以将 float64
截断为整数部分。
例如,可以这样使用:
if a.Trunc() == a {
// ...
}
请注意浮点数表示的常规限制。您可能希望检查 a.Trunc()
是否在 a
的某个小范围内,以考虑像 1.00000000000000002
这样的值。
英文:
How about math.Trunc? It truncates a float64
to its whole-number component.
For example, something like:
if a.Trunc() == a {
// ...
}
Beware of the usual considerations about floating-point representation limitations. You might wish to check whether a.Trunc()
is within some small range of a
, to account for values like 1.00000000000000002
.
答案4
得分: 0
我这样解决的:
isWhole := int(value * 100) == int(value) * 100
调整因子的位数,例如乘以10000来检查4位数。
英文:
I solved it like so:
isWhole := int(value * 100) == int(value) * 100
Adjust the number of digits in the factor, e.g. multiply by 10000 to check 4 digits.
答案5
得分: 0
只需将您的数字进行向上取整(ceil)或四舍五入(float),并将结果与原始值进行比较。
对我来说,最好的解决方案是:
var a float64 = 2.11
var b float64 = 3.00
fmt.Println(math.Ceil(a) == a) // 3.00 == 2.11; false; a不是整数
fmt.Println(math.Ceil(b) == b) // 3.00 == 3.00; true; b是整数
您可以使用一个函数:
func isWhole(x float64) bool {
return math.Ceil(x) == x
}
英文:
Just ceil or float your number and compare the result to origin value.
The best solution for me:
var a float64 = 2.11
var b float64 = 3.00
fmt.Println(math.Ceil(a) == a) // 3.00 == 2.11; false; a is not a whole number
fmt.Println(math.Ceil(b) == b) // 3.00 == 3.00; true; b is a whole number
You can use a function:
func isWhole(x float64) bool {
return math.Ceil(x) == x
}
答案6
得分: -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("不是整数")
} else {
fmt.Println("整数")
}
}
英文:
I think the following code might be useful,
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")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论