@@ -145,9 +145,10 @@ impl Number {
145
145
/// ```
146
146
/// # use serde_json::json;
147
147
/// #
148
- /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
148
+ /// let v = json!({ "a": 256.0, "b": 64, "c": -64, "d": nan });
149
149
///
150
150
/// assert!(v["a"].is_f64());
151
+ /// assert!(v["d"].is_f64());
151
152
///
152
153
/// // Integers.
153
154
/// assert!(!v["b"].is_f64());
@@ -230,11 +231,12 @@ impl Number {
230
231
/// ```
231
232
/// # use serde_json::json;
232
233
/// #
233
- /// let v = json!({ "a": 256.0, "b": 64, "c": -64 });
234
+ /// let v = json!({ "a": 256.0, "b": 64, "c": -64, "d": nan });
234
235
///
235
236
/// assert_eq!(v["a"].as_f64(), Some(256.0));
236
237
/// assert_eq!(v["b"].as_f64(), Some(64.0));
237
238
/// assert_eq!(v["c"].as_f64(), Some(-64.0));
239
+ /// assert!(v["d"].as_f64().unwrap().is_nan());
238
240
/// ```
239
241
#[ inline]
240
242
pub fn as_f64 ( & self ) -> Option < f64 > {
@@ -245,7 +247,7 @@ impl Number {
245
247
N :: Float ( n) => Some ( n) ,
246
248
}
247
249
#[ cfg( feature = "arbitrary_precision" ) ]
248
- self . n . parse :: < f64 > ( ) . ok ( ) . filter ( |float| float. is_finite ( ) )
250
+ self . n . parse :: < f64 > ( ) . ok ( ) . filter ( |float| ! float. is_infinite ( ) )
249
251
}
250
252
251
253
/// Converts a finite `f64` to a `Number`. Infinite or NaN values are not JSON
@@ -258,7 +260,9 @@ impl Number {
258
260
/// #
259
261
/// assert!(Number::from_f64(256.0).is_some());
260
262
///
261
- /// assert!(Number::from_f64(f64::NAN).is_none());
263
+ /// assert!(Number::from_f64(f64::NAN).is_some());
264
+ ///
265
+ /// assert!(Number::from_f64(f64::INFINITY).is_none());
262
266
/// ```
263
267
#[ inline]
264
268
pub fn from_f64 ( f : f64 ) -> Option < Number > {
@@ -275,6 +279,14 @@ impl Number {
275
279
} ;
276
280
Some ( Number { n } )
277
281
} else {
282
+ #[ cfg( not( feature = "arbitrary_precision" ) ) ]
283
+ {
284
+ if f. is_nan ( ) {
285
+ return Some ( Number {
286
+ n : N :: Float ( f64:: NAN ) ,
287
+ } ) ;
288
+ }
289
+ }
278
290
None
279
291
}
280
292
}
@@ -294,7 +306,7 @@ impl Display for Number {
294
306
match self . n {
295
307
N :: PosInt ( u) => formatter. write_str ( itoa:: Buffer :: new ( ) . format ( u) ) ,
296
308
N :: NegInt ( i) => formatter. write_str ( itoa:: Buffer :: new ( ) . format ( i) ) ,
297
- N :: Float ( f) => formatter. write_str ( ryu:: Buffer :: new ( ) . format_finite ( f) ) ,
309
+ N :: Float ( f) => formatter. write_str ( ryu:: Buffer :: new ( ) . format ( f) ) ,
298
310
}
299
311
}
300
312
0 commit comments