Я изначально пробовал это, однако оператор% не определен для float64.
func main(){
var a float64
a = 1.23
if a%1 == 0{
fmt.Println("yay")
}else{
fmt.Println("you fail")
}
}
Я изначально пробовал это, однако оператор% не определен для float64.
func main(){
var a float64
a = 1.23
if a%1 == 0{
fmt.Println("yay")
}else{
fmt.Println("you fail")
}
}
Предполагая, что ваши номера будут вписываться в int64
, вы можете просто сравнить значение float с преобразованным целочисленным значением, чтобы убедиться, что они одинаковы:
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? Он обрезает 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")
}
}