git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@9035 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 2003-08-10 20:10:28 +00:00
parent 4ae577f0ec
commit 4b9b211bd5
2 changed files with 36 additions and 20 deletions

View File

@ -172,6 +172,7 @@ restart_loop:
Split * new_split;
gnc_numeric amt_a, amt_b, amt_tot;
gnc_numeric val_a, val_b, val_tot;
gnc_numeric tmp;
Transaction *trans;
Timespec ts;
@ -189,11 +190,19 @@ restart_loop:
* i.e. so that (amt_a / amt_tot) = (val_a / val_tot)
*/
val_tot = split->value;
val_a = gnc_numeric_mul (amt_a, val_tot, GNC_DENOM_AUTO, GNC_RND_NEVER);
val_a = gnc_numeric_div (val_a, amt_tot, gnc_numeric_denom(val_tot), GNC_DENOM_EXACT);
val_a = gnc_numeric_mul (amt_a, val_tot,
GNC_DENOM_AUTO, GNC_DENOM_REDUCE);
tmp = gnc_numeric_div (val_a, amt_tot,
gnc_numeric_denom(val_tot), GNC_DENOM_EXACT);
val_a = tmp;
val_b = gnc_numeric_sub_fixed (val_tot, val_a);
PINFO ("split value is = %s = %s + %s",
gnc_numeric_to_string(val_tot),
gnc_numeric_to_string(val_a),
gnc_numeric_to_string(val_b) );
xaccSplitSetAmount (split, amt_a);
xaccSplitSetValue (split, val_a);

View File

@ -338,8 +338,9 @@ gnc_numeric_sub_fixed(gnc_numeric a, gnc_numeric b) {
gnc_numeric
gnc_numeric_mul(gnc_numeric a, gnc_numeric b,
gint64 denom, gint how) {
gnc_numeric product;
gint64 denom, gint how)
{
gnc_numeric product, result;
if(gnc_numeric_check(a) || gnc_numeric_check(b)) {
return gnc_numeric_error(GNC_ERROR_ARG);
@ -380,12 +381,14 @@ gnc_numeric_mul(gnc_numeric a, gnc_numeric b,
}
if((denom == GNC_DENOM_AUTO) &&
((how & GNC_NUMERIC_DENOM_MASK) == GNC_DENOM_LCD)) {
((how & GNC_NUMERIC_DENOM_MASK) == GNC_DENOM_LCD))
{
denom = gnc_numeric_lcd(a, b);
how = how & GNC_NUMERIC_RND_MASK;
}
return gnc_numeric_convert(product, denom, how);
result = gnc_numeric_convert(product, denom, how);
return result;
}
@ -485,7 +488,8 @@ gnc_numeric_abs(gnc_numeric a) {
********************************************************************/
gnc_numeric
gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how)
{
gnc_numeric out;
gnc_numeric temp;
gint64 temp_bc;
@ -500,8 +504,12 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
return gnc_numeric_error(GNC_ERROR_ARG);
}
if(denom == GNC_DENOM_AUTO) {
switch(how & GNC_NUMERIC_DENOM_MASK) {
if(denom == GNC_DENOM_AUTO)
{
switch(how & GNC_NUMERIC_DENOM_MASK)
{
default:
case GNC_DENOM_LCD: /* LCD is meaningless with AUTO in here */
case GNC_DENOM_EXACT:
return in;
break;
@ -542,19 +550,15 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
how = how & ~GNC_DENOM_SIGFIG & ~GNC_NUMERIC_SIGFIGS_MASK;
break;
case GNC_DENOM_LCD:
/* this is a no-op. */
default:
break;
}
}
/* make sure we need to do the work */
/* Make sure we need to do the work */
if(in.denom == denom) {
return in;
}
/* if the denominator of the input value is negative, get rid of that. */
/* If the denominator of the input value is negative, get rid of that. */
if(in.denom < 0) {
in.num = in.num * (- in.denom);
in.denom = 1;
@ -562,9 +566,10 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
sign = (in.num < 0) ? -1 : 1;
/* if the denominator is less than zero, we are to interpret it as
/* If the denominator is less than zero, we are to interpret it as
* the reciprocal of its magnitude. */
if(denom < 0) {
if(denom < 0)
{
denom = - denom;
denom_neg = 1;
temp_a = (in.num < 0) ? -in.num : in.num;
@ -573,8 +578,9 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
out.num = in.num / temp_bc;
out.denom = - denom;
}
else {
/* do all the modulo and int division on positive values to make
else
{
/* Do all the modulo and int division on positive values to make
* things a little clearer. Reduce the fraction denom/in.denom to
* help with range errors (FIXME : need bigger intermediate rep) */
temp.num = denom;
@ -588,7 +594,8 @@ gnc_numeric_convert(gnc_numeric in, gint64 denom, gint how) {
out.denom = denom;
}
if(remainder > 0) {
if(remainder > 0)
{
switch(how) {
case GNC_RND_FLOOR:
if(sign < 0) {