在Rust中将浮点数转换为整数

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

如何将上面的C代码转换为Rust?特别是第2行代码,它会将数字四舍五入。

3个回答

111
首先,这是不正确的。将实数“round”取整是返回最接近的整数。你只是将其转换为int,这会丢弃所有非整数部分。尤其是第二行代码。

但这是您的精确代码的Rust等效版本(假设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;

请注意,还有trunc, ceilfloor等方法。您可以使用其中之一来精确控制发生的情况,而不是依赖于强制类型转换。从 Rust 书籍中我们可以了解到:
“将浮点数强制转换为整数会向零舍入。”
这种行为相当于trunc,但如果这种行为对您很重要,您应该使用trunc来...
  1. ...在代码中表达您的意图
  2. ...即使Rust编译器更改了强制转换语义,也具有有效的语义

16

要将一个浮点数转换为整数,您可以使用as。例如:

let b = (a / 100000.0) as i64;

3
这是Rust中round的示例。 您需要按其类型正确编写数字常量: 例如,如果d是f64并且您想将其乘以10,则正确的约定是写入: d * 10.0 而不是: d * 10
并明确定义变量类型,以在这些情况下使用round函数。
let a = 2e50;
let b : f64 = a / 100000.0;
let c = b.round() as i64;
println!("{}", c);

b 仍然是一个浮点数,而不是整数。 - SOFe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接