检查浮点数是否可以无损地转换为整数

Check if a float can be converted to integer without loss

我想检查一个整数是否是 2 的幂。我的标准方法是查看 log₂(x) 是否是一个整数值,但是我发现没有优雅的方法可以做到这一点。我的方法如下:

let x = 65;

let y = (x as f64).log(2.0);

// Compute the difference between y and the result of
// of truncating y by casting to int and back
let difference = y - (y as i64 as f64);

// This looks nice but matches on float values will be phased out
match difference {
    0.0 => println!("{} is a power of 2", x),
    _ => println!("{} is NO power of 2", x),
}

// This seems kind of clunky
if difference == 0.0 {
    println!("{} is a power of 2", x);
} else {
    println!("{} is NO power of 2", x);
}

Rust 中是否有一个内置选项来检查浮点数是否可以在不截断的情况下转换为整数?

行为类似于:

42.0f64.is_int() // True/ Ok()
42.23f64.is_int() // False/ Err()

换句话说,一个方法/宏/等允许我检查我是否会通过转换为 int 丢失信息(小数)。


我已经发现可以使用 x.count_ones() == 1.

高效地检查整数是否为 2 的幂

您可以使用fract检查是否有非零小数部分:

42.0f64.fract() == 0.0;
42.23f64.fract() != 0.0;

请注意,这仅在您已经知道该号码在范围内时才有效。如果您需要额外检查以测试浮点数在 0 和 u32::MAX 之间(或在 i32::MINi32::MAX 之间),那么您不妨进行转换并检查它没有失去精度:

x == (x as u32) as f64