Grisu is a fast, new algorithm for converting a floating-point number to a decimal string. It was introduced in a paper by Florian Loitsch in 2010 (http://dl.acm.org/citation.cfm?doid=1809028.1806623) and it as much as four times faster than previous techniques.
The code here is a port of the C++ code in the "double-conversion" project on Google Code (http://code.google.com/p/double-conversion/) to C#. My focus is on very fast JSON serialization of floating point numbers, however, so I eliminated all the options and configurability.
Instead of offering options, my port aims to:
- Guarantee that the generated strings can be parsed back to an identical double. It uses the fewest digits possible while still achieving this.
- Produce the most compact JSON-compatible strings possible by choosing regular decimal or scientific notation, whichever is shorter.
- Be really, really fast.
Using this library is simple, because it really has only one method.
StringBuilder builder = new StringBuilder();
GrisuDotNet.Grisu.DoubleToString(1.23, builder);
Assert.AreEqual("1.23", builder.ToString());
In my tests on a 64-bit version of .NET 4, this library writes doubles to a StringBuilder over two times faster than StringBuilder's default serialization of doubles, while guaranteeing that the strings round-trip back to the same doubles. When the "R" format specifier is used with Double.ToString to guarantee that a double round-trips, this library produces output over four times faster and also generates more compact output.
If you make any improvements to this code - especially performance improvements - please send me a pull request.