From 537fd995a3221db3ca5ec785a3247851b5464c40 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sat, 2 Jun 2018 16:20:36 -0700 Subject: [PATCH] Ensure full precision of doubles is saved to SQL. std::iostream's operator<<(double) uses only 6 digits of precision by default. We want 12 digits when saving. --- .../sql/gnc-sql-column-table-entry.hpp | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp index 0465589802..9e3809bf54 100644 --- a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp +++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp @@ -31,6 +31,8 @@ extern "C" #include #include #include +#include + #include "gnc-sql-result.hpp" struct GncSqlColumnInfo; @@ -384,6 +386,22 @@ GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name, } } +template <> inline void +GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name, + const void* pObject, + PairVec& vec, std::true_type) const +{ + double* s = get_row_value_from_object(obj_name, pObject); + + if (s != nullptr) + { + std::ostringstream stream; + stream << std::setprecision(12) << std::fixed << *s; + vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str())); + return; + } +} + template void GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name, const void* pObject, @@ -397,6 +415,19 @@ GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name, return; } +template <> inline void +GncSqlColumnTableEntry::add_value_to_vec(QofIdTypeConst obj_name, + const void* pObject, + PairVec& vec, std::false_type) const +{ + double s = *get_row_value_from_object(obj_name, pObject); + + std::ostringstream stream; + stream << std::setprecision(12) << std::fixed << s; + vec.emplace_back(std::make_pair(std::string{m_col_name}, stream.str())); + return; +} + /** * Load an arbitrary object from a result row. *