Fix serialization of -0.0. (#426)

This commit is contained in:
Eric Huss 2021-04-26 07:05:28 -07:00 committed by GitHub
parent 2c08988a44
commit fed4022c88

View file

@ -751,17 +751,21 @@ impl<'a> Serializer<'a> {
macro_rules! serialize_float {
($this:expr, $v:expr) => {{
$this.emit_key(ArrayState::Started)?;
if ($v.is_nan() || $v == 0.0) && $v.is_sign_negative() {
write!($this.dst, "-").map_err(ser::Error::custom)?;
}
if $v.is_nan() {
write!($this.dst, "nan").map_err(ser::Error::custom)?;
} else {
write!($this.dst, "{}", $v).map_err(ser::Error::custom)?;
}
if $v % 1.0 == 0.0 {
write!($this.dst, ".0").map_err(ser::Error::custom)?;
match ($v.is_sign_negative(), $v.is_nan(), $v == 0.0) {
(true, true, _) => write!($this.dst, "-nan"),
(false, true, _) => write!($this.dst, "nan"),
(true, false, true) => write!($this.dst, "-0.0"),
(false, false, true) => write!($this.dst, "0.0"),
(_, false, false) => write!($this.dst, "{}", $v).and_then(|_| {
if $v % 1.0 == 0.0 {
write!($this.dst, ".0")
} else {
Ok(())
}
}),
}
.map_err(ser::Error::custom)?;
if let State::Table { .. } = $this.state {
$this.dst.push_str("\n");
}