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; } |
我对此相当满意,因为这是我在其他地方处理过的方式,但是我将进行更多测试。
1 2 3 | fn currency_double_to_int(amount: f64) -> i64 { (amount * 100.0).round() as i64 } |
这样,您应该每次都获得标准舍入而不是截断。 我怀疑,该舍入与libc舍入相同。 另请参阅此游戏围栏以进行一些演示。