diff --git a/libgnucash/backend/dbi/gnc-dbisqlresult.cpp b/libgnucash/backend/dbi/gnc-dbisqlresult.cpp index 5b2a784e2a..334061ad03 100644 --- a/libgnucash/backend/dbi/gnc-dbisqlresult.cpp +++ b/libgnucash/backend/dbi/gnc-dbisqlresult.cpp @@ -30,6 +30,7 @@ extern "C" /* For direct access to dbi data structs, sadly needed for datetime */ #include } +#include #include #include "gnc-dbisqlresult.hpp" #include "gnc-dbisqlconnection.hpp" @@ -109,7 +110,7 @@ GncDbiSqlResult::IteratorImpl::get_int_at_col(const char* col) const return dbi_result_get_longlong (m_inst->m_dbi_result, col); } -float +double GncDbiSqlResult::IteratorImpl::get_float_at_col(const char* col) const { auto type = dbi_result_get_field_type (m_inst->m_dbi_result, col); @@ -118,8 +119,9 @@ GncDbiSqlResult::IteratorImpl::get_float_at_col(const char* col) const (attrs & DBI_DECIMAL_SIZEMASK) != DBI_DECIMAL_SIZE4) throw (std::invalid_argument{"Requested float from non-float column."}); auto locale = gnc_push_locale (LC_NUMERIC, "C"); - auto retval = dbi_result_get_float(m_inst->m_dbi_result, col); + auto interim = dbi_result_get_float(m_inst->m_dbi_result, col); gnc_pop_locale (LC_NUMERIC, locale); + double retval = static_cast(round(interim * 1000000.0)) / 1000000.0; return retval; } diff --git a/libgnucash/backend/dbi/gnc-dbisqlresult.hpp b/libgnucash/backend/dbi/gnc-dbisqlresult.hpp index faf51435bb..c0dd59e9bf 100644 --- a/libgnucash/backend/dbi/gnc-dbisqlresult.hpp +++ b/libgnucash/backend/dbi/gnc-dbisqlresult.hpp @@ -54,7 +54,7 @@ protected: virtual GncSqlRow& operator++(int) { return ++(*this); }; virtual GncSqlResult* operator*() { return m_inst; } virtual int64_t get_int_at_col (const char* col) const; - virtual float get_float_at_col (const char* col) const; + virtual double get_float_at_col (const char* col) const; virtual double get_double_at_col (const char* col) const; virtual std::string get_string_at_col (const char* col)const; virtual time64 get_time64_at_col (const char* col) const; diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp index 7a38b82ba9..cba8d17be8 100644 --- a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp +++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp @@ -283,7 +283,7 @@ GncSqlColumnTableEntryImpl::load (const GncSqlBackend* sql_be, { try { - val = static_cast(row.get_float_at_col(m_col_name)); + val = row.get_float_at_col(m_col_name); } catch (std::invalid_argument&) { diff --git a/libgnucash/backend/sql/gnc-sql-result.hpp b/libgnucash/backend/sql/gnc-sql-result.hpp index 818df82c25..3c5c558a93 100644 --- a/libgnucash/backend/sql/gnc-sql-result.hpp +++ b/libgnucash/backend/sql/gnc-sql-result.hpp @@ -52,7 +52,7 @@ protected: virtual GncSqlRow& operator++() = 0; virtual GncSqlResult* operator*() = 0; virtual int64_t get_int_at_col (const char* col) const = 0; - virtual float get_float_at_col (const char* col) const = 0; + virtual double get_float_at_col (const char* col) const = 0; virtual double get_double_at_col (const char* col) const = 0; virtual std::string get_string_at_col (const char* col) const = 0; virtual time64 get_time64_at_col (const char* col) const = 0; @@ -88,7 +88,7 @@ public: friend bool operator!=(const GncSqlRow&, const GncSqlRow&); int64_t get_int_at_col (const char* col) const { return m_iter->get_int_at_col (col); } - float get_float_at_col (const char* col) const { + double get_float_at_col (const char* col) const { return m_iter->get_float_at_col (col); } double get_double_at_col (const char* col) const { return m_iter->get_double_at_col (col); } diff --git a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp index b0b9ced838..a99038542f 100644 --- a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp +++ b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp @@ -66,7 +66,7 @@ protected: virtual GncSqlResult* operator*() { return m_inst; } virtual int64_t get_int_at_col (const char* col) const { return 1LL; } - virtual float get_float_at_col (const char* col) const + virtual double get_float_at_col (const char* col) const { return 1.0; } virtual double get_double_at_col (const char* col) const { return 1.0; }