diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs index 1a54f5c1..e459fa1c 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs @@ -51,6 +51,20 @@ namespace Newtonsoft.Json.Tests.Linq [TestFixture] public class JTokenReaderTest : TestFixtureBase { +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + [Test] + public void ConvertBigIntegerToDouble() + { + var jObject = JObject.Parse("{ maxValue:10000000000000000000}"); + + JsonReader reader = jObject.CreateReader(); + Assert.IsTrue(reader.Read()); + Assert.IsTrue(reader.Read()); + Assert.AreEqual(10000000000000000000d, reader.ReadAsDouble()); + Assert.IsTrue(reader.Read()); + } +#endif + [Test] public void ErrorTokenIndex() { diff --git a/Src/Newtonsoft.Json/JsonReader.cs b/Src/Newtonsoft.Json/JsonReader.cs index ce71c23e..bae24cff 100644 --- a/Src/Newtonsoft.Json/JsonReader.cs +++ b/Src/Newtonsoft.Json/JsonReader.cs @@ -622,12 +622,24 @@ namespace Newtonsoft.Json case JsonToken.Float: if (!(Value is double)) { - SetToken(JsonToken.Float, Convert.ToDouble(Value, CultureInfo.InvariantCulture), false); + double d; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (Value is BigInteger) + { + d = (double)(BigInteger)Value; + } + else +#endif + { + d = Convert.ToDouble(Value, CultureInfo.InvariantCulture); + } + + SetToken(JsonToken.Float, d, false); } - return (double) Value; + return (double)Value; case JsonToken.String: - return ReadDoubleString((string) Value); + return ReadDoubleString((string)Value); } throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t));