diff options
author | Craig Earls <enderw88@gmail.com> | 2013-01-30 15:51:23 -0700 |
---|---|---|
committer | Craig Earls <enderw88@gmail.com> | 2013-01-30 15:51:23 -0700 |
commit | aeac4fe252954c21be0b6d2bac67ee74be77bf86 (patch) | |
tree | b362915d8bf22d8192cd052d4efdaeb76e235649 /src/amount.cc | |
parent | b334be6d382d3bef45fb4ad46e0f52fd6cb9e0a4 (diff) | |
parent | 0df13661686dfec66aa0d5a8dd88920e1e104fbc (diff) | |
download | fork-ledger-aeac4fe252954c21be0b6d2bac67ee74be77bf86.tar.gz fork-ledger-aeac4fe252954c21be0b6d2bac67ee74be77bf86.tar.bz2 fork-ledger-aeac4fe252954c21be0b6d2bac67ee74be77bf86.zip |
Merge branch 'Bug634-floor-ceil-round' into kitchen-sink
Diffstat (limited to 'src/amount.cc')
-rw-r--r-- | src/amount.cc | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/amount.cc b/src/amount.cc index ee03827e..51e69290 100644 --- a/src/amount.cc +++ b/src/amount.cc @@ -30,6 +30,7 @@ */ #include <system.hh> +#include <math.h> #include "amount.h" #include "commodity.h" @@ -672,31 +673,31 @@ void amount_t::in_place_truncate() void amount_t::in_place_floor() { if (! quantity) - throw_(amount_error, _("Cannot floor an uninitialized amount")); + throw_(amount_error, _("Cannot compute floor on an uninitialized amount")); _dup(); - 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); + mpz_fdiv_q(temp, mpq_numref(MP(quantity)), mpq_denref(MP(quantity))); + mpq_set_z(MP(quantity), temp); } void amount_t::in_place_ceiling() { if (! quantity) - throw_(amount_error, _("Cannot ceiling an uninitialized amount")); + throw_(amount_error, _("Cannot compute ceiling on an uninitialized amount")); _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); + mpz_cdiv_q(temp, mpq_numref(MP(quantity)), mpq_denref(MP(quantity))); + mpq_set_z(MP(quantity), temp); +} + +void amount_t::in_place_roundto(int places) +{ + if (! quantity) + throw_(amount_error, _("Cannot round an uninitialized amount")); + double x=ceil(mpq_get_d(MP(quantity))*pow(10, places) - 0.49999999) / pow(10, places); + mpq_set_d(MP(quantity), x); } void amount_t::in_place_unround() |