double b = a / 100000;
b = (int) b;
b *= 100000;

上面的C代码是如何转换成Rust的?尤其是对数字进行四舍五入的第#2行.

推荐答案

尤其是对数字进行四舍五入的第#2行.

首先,这不是真的."四舍五入"实数就是返回最接近的整数.只需将其转换为int,即可丢弃所有非整数部分.


但以下是与您的确切代码对应的代码(假设a的类型为f64):

let b = a / 100_000.0;    // underscore in number to increase readability
let b = b as i64;
let b = b * 100_000;

当然,这也可以写在一行中:

let b = ((a / 100_000.0) as i64) * 100_000;

如果您想取整,而不是只取整数部分,可以使用f64round方法:

let b = ((a / 100_000.0).round() as i64) * 100_000;

请注意,还有truncceilfloor.您可以使用其中一种方法来精确控制发生的情况,而不是依赖于强制转换.From the Rust book我们可以学到:

从浮点数到整数的转换将使浮点数向零舍入.

这个行为相当于trunc,但是如果这个行为对你来说很重要,你应该用trunc来...

  1. ... 用代码表达你的意图
  2. ... 即使Rust编译器更改了强制转换语义,也要具有有效的语义

Rust相关问答推荐

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

为什么我需要在这个代码示例中使用&

如何从使用mockall模拟的方法中返回self?

包含嵌套 struct 的CSV

收集RangeInclusive T到Vec T<><>

如何最好地并行化修改同一Rust向量的多个切片的代码?

使用Clap时如何将String作为Into Str参数传递?

如何删除Mac Tauri上的停靠图标?

使用Box优化可选的已知长度数组的内存分配

函数内模块的父作用域的访问类型

类型批注需要静态生存期

在本例中,为什么我不能一次多次borrow 可变变量?

获取与父字符串相关的&;str的原始片段

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

为什么BufReader实际上没有缓冲短寻道?

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

如何迭代存储在 struct 中的字符串向量而不移动它们?

go 重并堆积MPSC通道消息

如何将 Rust 字符串转换为 i8(c_char) 数组?

有没有办法隐藏类型定义?