Как проверить, является ли float целым числом в Go? - программирование
Подтвердить что ты не робот

Как проверить, является ли float целым числом в Go?

Я изначально пробовал это, однако оператор% не определен для float64.

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

Ответ 1

Предполагая, что ваши номера будут вписываться в 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.

Ответ 2

Вы можете использовать функцию 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.

Ответ 3

Как насчет math.Trunc? Он обрезает float64 до его целочисленного компонента.

Например, что-то вроде:

if a.Trunc() == a {
    // ...
}

Остерегайтесь обычных соображений о ограничениях представления с плавающей запятой. Возможно, вы захотите проверить, находится ли a.Trunc() в пределах небольшого диапазона a, для учета таких значений, как 1.00000000000000002.

Ответ 4

Я решил это так:

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

Отрегулируйте количество цифр в коэффициенте, например, умножьте на 10000, чтобы проверить 4 цифры.

Ответ 5

Я думаю, что следующий код может быть полезен,

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")
    }
}