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::MAXf64的转换是不精确的,而将上面的转换应用到1e100最终会得到一个很大的负值(在我的测试中,正如前面提到的,它实际上是未定义的).

最好的 Select 似乎是,如果浮点值超出了应用程序预期的合理范围,则返回一些错误.

Rust相关问答推荐

as操作符如何将enum转换为int?

为什么拥有的trait对象的相等运算符移动了正确的操作数?

创建包含缺失值的框架

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

在rust sqlx中使用ilike和push bind

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

如何go 除多余的(0..)在迭代中,当它不被使用时?

允许 rust 迹 struct 条目具有多种类型

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

Rust Axum 框架 - 解包安全吗?

为什么切片时需要参考?

Rust 中多个 & 符号的内存表示

从 HashMap>, _> 中删除的生命周期问题

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

如何在 Rust 中将 UTF-8 十六进制值转换为 char?

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

Rust 中函数的类型同义词

为什么-x试图解析为文字并在声明性宏中失败?

有没有办法在 Rust 中对 BigInt 进行正确的位移?