Rust的f64
类型提供函数round()
,它舍入到最接近的整数,但返回f64
.而Java的Math.round(double)
则返回long
.我可以先打round()
,然后再投i64
,但这能保证我得到正确的结果吗?在这里,"correct"意味着获得最接近的i64
,Java的round()
返回"最近的long".
Rust的f64
类型提供函数round()
,它舍入到最接近的整数,但返回f64
.而Java的Math.round(double)
则返回long
.我可以先打round()
,然后再投i64
,但这能保证我得到正确的结果吗?在这里,"correct"意味着获得最接近的i64
,Java的round()
返回"最近的long".
从the book开始,从浮点类型到整数类型的转换向零取整,所以先取整几乎是正确的:f.round() as i64
.
然而,如果f64
超出i64
的范围(巨大幅度),这也是目前未定义的行为(但这是a bug).因此,您应该首先钳制该值(或者更好地说,引发错误或断言).可能显而易见的答案是行不通的:
f.max(std::i64::MIN as f64).min(std::i64::MAX as f64).round() as i64
因为从i64::MAX
到f64
的转换是不精确的,而将上面的转换应用到1e100
最终会得到一个很大的负值(在我的测试中,正如前面提到的,它实际上是未定义的).
最好的 Select 似乎是,如果浮点值超出了应用程序预期的合理范围,则返回一些错误.