11

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

Rust 如何处理 f64 到 i64 的舍入,最好的使用方法是什么——“as i64”或“to_i64()”?

根据我所做的时间安排,这两种方法看起来并不相同,但结果可能相同。(“as i64”似乎稍微快了一点)。

示例(简化为仅使用 2 个小数位 - 单一货币):

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

首次发布后 14 小时编辑:

在做了更多测试之后,在我看来,以下是使用 Rust 处理将浮点数转换为整数的方法:

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;      
}

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

4

1 回答 1

13

f64有一个round方法因此你可以这样做:

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

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

于 2014-10-10T18:10:08.413 回答