Rust的f64
類型提供函數round()
,該函數四捨五入到最接近的整數,但它返回f64
。另一方面,Java的Math.round(double)
返回long
。我可以撥打round()
,然後投到i64
,但是這會保證我得到正確的結果嗎?在這裏,「正確」意味着獲得最近的i64
- Java的round()
返回「最接近的長度」。將f64四捨五入到Rust中的最接近的i64
回答
從the book,從浮點到整數類型轉換爲零,所以舍入首先幾乎是正確的:f.round() as i64
。
但是,如果f64
超出i64
的範圍(巨大幅度),它也是當前未定義的行爲(但這是a bug)。因此,您應該先將值設置爲(或者更好,提出錯誤或斷言)。可能爲答案顯然不起作用:
f.max(std::i64::MIN as f64).min(std::i64::MAX as f64).round() as i64
因爲i64::MAX
到f64
的轉換是不完全一樣,並應用上面1e100
具有較大的負值(在我的測試結束了,因爲提到它實際上未定義)。
如果浮點值超出了應用程序預期的合理範圍,最好的選擇似乎是返回一些錯誤。
看來你需要一種方法來獲得適合'f64'的整數值的連續範圍的下限和上限,以便能夠鉗位或引發異常。否則,由於未定義的行爲,您實際上無法檢查轉換。也許語言應該公開[那些](http://stackoverflow.com/questions/3793838/which-is-the-first-integer-that-an-ieee-754-float-is-incapable-of-representing-e )。 –
我同意,在一般情況下。但是,對於任何(確定的,大部分)給定的應用程序,這可能有一個限制。 –
鑑於我們正在談論2 ,是的,這可能是一個很好的限制! –
可以使用conv
箱子此:
use conv::prelude::*;
let x = 9_223_371_487_098_961_920i64 as f64;
println!("{:?}", x.approx_as_by::<i64, RoundToNearest>());
// Ok(9223371487098962944)
let x = 9_223_372_036_854_775_807i64 as f64;
println!("{:?}", x.approx_as_by::<i64, RoundToNearest>());
// Err(FloatError::PosOverflow(..))
下面是一個簡單的「回信封」執行:
const INTEGRAL_LIMIT: f64 = 9007199254740992.0;
#[derive(Debug, PartialEq, Eq)]
enum Error {
NaN,
Overflow,
Underflow,
}
fn try_from(f: f64) -> Result<i64, Error> {
let f = f.round();
if f.is_nan() { return Err(Error::NaN); }
if f < -INTEGRAL_LIMIT { return Err(Error::Underflow); }
if f > INTEGRAL_LIMIT { return Err(Error::Overflow); }
Ok(f as i64)
}
它配備了一個最小的測試套件,通過:
fn main() {
assert_eq!(try_from(std::f64::NAN), Err(Error::NaN));
assert_eq!(try_from(std::f64::NEG_INFINITY), Err(Error::Underflow));
assert_eq!(try_from(-9007199254740994.0), Err(Error::Underflow));
assert_eq!(try_from(9007199254740994.0), Err(Error::Overflow));
assert_eq!(try_from(std::f64::INFINITY), Err(Error::Overflow));
assert_eq!(try_from(-INTEGRAL_LIMIT), Ok(-9007199254740992));
assert_eq!(try_from(INTEGRAL_LIMIT), Ok(9007199254740992));
}
我其實期待TryFrom
implementa可用,但沒有發現。
- 1. 四捨五入到最接近
- 2. 四捨五入到最近的年份
- 3. 四捨五入到最接近的五個
- 4. 如何將數字四捨五入到最接近的.5?
- 5. 將數字四捨五入到最接近的十位
- 6. 如何將浮點四捨五入到最接近的.001
- 7. 四捨五入/關最近的5
- 8. 四捨五入到C的1/16的最接近倍數
- 9. jQuery的四捨五入到最接近的整數
- 10. 的javascript - 如何四捨五入到最接近的整數
- 11. 將值四捨五入爲最接近的50
- 12. 四捨五入甲骨文SYSDATE到最接近的小時
- 13. 四捨五入到最接近的整數變量
- 14. Java四捨五入到最接近的0.05
- 15. 四捨五入到最接近的下一個數字
- 16. 如何使用C#四捨五入到最接近的.5#
- 17. 四捨五入到最接近的結局位數
- 18. 四捨五入到最接近的十分之一?
- 19. 我如何四捨五入到最接近的0.5?
- 20. 如何四捨五入到最接近的第十位
- 21. 四捨五入到最接近的50美分
- 22. 停止jQuery四捨五入到最接近的十進制.css()
- 23. MATLAB被四捨五入到最接近的整數
- 24. 四捨五入到最接近的數字紅寶石
- 25. 四捨五入次最接近的小時中的R
- 26. 四捨五入到最接近零,按位
- 27. 如何將小數點四捨五入到SQL中最接近的偶數?
- 28. 將四捨五入的浮點數湊整到最接近的0.05
- 29. 如何將小數點四捨五入到最接近的八分之一C
- 30. 如何將一個數字四捨五入到最接近的x增量值
如果'f64'是整數,但超出'i64'的範圍,你會發生什麼? –
@ChrisEmerson在這種情況下,Java似乎將'1e100'到'9223372036854775807'。 – Shepmaster