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]
This commit is contained in:
parent
ca4f53655e
commit
f102123b65
@ -1974,10 +1974,7 @@ macro_rules! read_primitive {
|
||||
}
|
||||
}
|
||||
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<uint, V> etc)
|
||||
@ -2830,6 +2827,9 @@ mod tests {
|
||||
|
||||
let v: i64 = super::decode("9223372036854775807").unwrap();
|
||||
assert_eq!(v, i64::MAX);
|
||||
|
||||
let res: DecodeResult<i64> = super::decode("765.25252");
|
||||
assert_eq!(res, Err(ExpectedError("Integer".into_string(), "765.25252".into_string())));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
Loading…
x
Reference in New Issue
Block a user