diff --git a/src/ser.rs b/src/ser.rs index e115541..0eb2bfb 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -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"); }