summaryrefslogtreecommitdiff
path: root/src/amount.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2012-10-26 08:31:57 -0700
committerJohn Wiegley <johnw@newartisans.com>2012-10-26 08:31:57 -0700
commit7cee6c559b8198aea9fc75a197bac7bc6e71eaeb (patch)
treefac4c09dba9035c01a25ad84bc4fd3d12fdaa4f7 /src/amount.cc
parent34ca6b3991d63dd04d60286452399c7e0d49974b (diff)
parentb044a74bd34afdc27baf6241fe398690ff5e043a (diff)
downloadfork-ledger-7cee6c559b8198aea9fc75a197bac7bc6e71eaeb.tar.gz
fork-ledger-7cee6c559b8198aea9fc75a197bac7bc6e71eaeb.tar.bz2
fork-ledger-7cee6c559b8198aea9fc75a197bac7bc6e71eaeb.zip
Merge pull request #96 from enderw88/Bug634-floor-ceil-round
Bug 634 and 488, Corrected behavior of floor, and added ceiling
Diffstat (limited to 'src/amount.cc')
-rw-r--r--src/amount.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/amount.cc b/src/amount.cc
index 6ecb3558..4e658212 100644
--- a/src/amount.cc
+++ b/src/amount.cc
@@ -670,10 +670,27 @@ void amount_t::in_place_floor()
_dup();
- std::ostringstream out;
- stream_out_mpq(out, MP(quantity), precision_t(0), -1, GMP_RNDZ);
+ mpz_t quot;
+ mpz_init(quot);
+ mpz_fdiv_q(quot, mpq_numref(MP(quantity)), mpq_denref(MP(quantity)));
+ mpq_clear(MP(quantity));
+ mpq_init(MP(quantity));
+ mpq_set_num(MP(quantity), quot);
+}
+
+void amount_t::in_place_ceiling()
+{
+ if (! quantity)
+ throw_(amount_error, _("Cannot ceiling an uninitialized amount"));
- mpq_set_str(MP(quantity), out.str().c_str(), 10);
+ _dup();
+
+ mpz_t quot;
+ mpz_init(quot);
+ mpz_cdiv_q(quot, mpq_numref(MP(quantity)), mpq_denref(MP(quantity)));
+ mpq_clear(MP(quantity));
+ mpq_init(MP(quantity));
+ mpq_set_num(MP(quantity), quot);
}
void amount_t::in_place_unround()