Rust将f64转换为i64时如何处理舍入?

How does Rust handle rounding in conversion of f64 to i64?

我已经对例如货币处理进行了一些测试。快去飞镖吧。基本上,我认为处理货币的最佳方法是将双精度转换为整数,以便所有计算都使用整数进行,这是公认的方法。但是,不同的语言对转换为整数的处理方式有所不同。例如,因此Go会截断两倍,我认为有必要添加一个舍入因子以进行补偿。使用Rust,我发现进行直接转换(见下文)似乎可行,但是我不确定Rust实际如何使用两种处理转换的方法来处理转换。

Rust如何处理f64到i64的舍入?最好的使用方法是" as as i64"或" to_i64()"?

根据我的时间安排,此处的两种方法看起来并不相同,但结果可能是相同的。 (" as i64"的出现速度略快)。

示例(简化为仅使用小数点后两位-单一货币):

1
2
3
4
fn fCcyDblToInt(dCcyAmt: f64) -> i64 {
 //  return (dCcyAmt * 100.0).to_i64();
 return (dCcyAmt * 100.0) as i64;
}

初次发布后14小时编辑:

经过更多测试之后,对我来说,以下是使用Rust处理float到integer的方法:

1
2
3
4
5
fn fCcyDblToInt(dCcyAmt:f64) -> i64 {
  let dRound: f64 = if dCcyAmt > 0.0 { 0.5 } else if dCcyAmt < 0.0 {-0.5 } else {0.0};
 // return ((dCcyAmt * 100.0) +dRound).to_i64();
  return ((dCcyAmt * 100.0) +dRound) as i64;      
}

我对此相当满意,因为这是我在其他地方处理过的方式,但是我将进行更多测试。


f64具有round方法? 因此,您可以执行以下操作:

1
2
3
fn currency_double_to_int(amount: f64) -> i64 {
    (amount * 100.0).round() as i64
}

这样,您应该每次都获得标准舍入而不是截断。 我怀疑,该舍入与libc舍入相同。 另请参阅此游戏围栏以进行一些演示。