commit 5bd14af8871b8f87c2c73ca8392b7c72217ad72d Author: Enrico Forestieri <for...@lyx.org> Date: Sat Jul 12 19:12:08 2014 +0200
Fix bug #9193: Spacing modification not exact The conversion from floating point to string performed by boost:lexical_cast does not allow specifying a precision and, for example, values such as 0.9 are resturned as 0.899999976. The standard C++ way for performing the conversion is using std::ostringstream which is exempt from this problem, even if less efficient. For the sake of accuracy, boost::lexical_cast is ditched in favor of the ostrinsgstream implementation. In C++11 another option would be using std::to_string, but I think it is not as efficient as the boost way and not worth implementing through #ifdef's. Incidentally, this patch would have also fixed #9190 and all similar cases involving the use of convert<string>(float|double). diff --git a/src/support/convert.cpp b/src/support/convert.cpp index 70cd91e..6b985f5 100644 --- a/src/support/convert.cpp +++ b/src/support/convert.cpp @@ -17,6 +17,7 @@ #include <boost/lexical_cast.hpp> #include <string> +#include <sstream> //needed for Mac OSX 10.5.2 Leopard #include <cstdlib> @@ -106,14 +107,18 @@ docstring convert<docstring>(long l) template<> string convert<string>(float f) { - return lexical_cast<string>(f); + std::ostringstream val; + val << f; + return val.str(); } template<> string convert<string>(double d) { - return lexical_cast<string>(d); + std::ostringstream val; + val << d; + return val.str(); }