From f102123b659911dbee25bbe518d73d66185bb978 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Mon, 24 Nov 2014 03:00:10 +0900 Subject: [PATCH] libserialize: Do not coerce to integer when decoding a float value When an integral value is expected by the user but a fractional value is found, the current implementation uses std::num::cast() to coerce to an integer type, losing the fractional part. This behavior is not desirable because the number loses precision without notice. This commit makes it raise ExpectedError when such a situation arises. [breaking-change] --- src/libserialize/json.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 371034746fc..23e2c4b9830 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -1974,10 +1974,7 @@ fn $name(&mut self) -> DecodeResult<$ty> { } } Json::F64(f) => { - match num::cast(f) { - Some(f) => Ok(f), - None => Err(ExpectedError("Number".to_string(), format!("{}", f))), - } + Err(ExpectedError("Integer".to_string(), format!("{}", f))) } Json::String(s) => { // re: #12967.. a type w/ numeric keys (ie HashMap etc) @@ -2830,6 +2827,9 @@ fn test_decode_numbers() { let v: i64 = super::decode("9223372036854775807").unwrap(); assert_eq!(v, i64::MAX); + + let res: DecodeResult = super::decode("765.25252"); + assert_eq!(res, Err(ExpectedError("Integer".into_string(), "765.25252".into_string()))); } #[test] -- GitLab