# gnc_numeric: fractional displays and rounding

Charles Day cedayiv at gmail.com
Thu Aug 7 12:51:07 EDT 2008

```On Thu, Aug 7, 2008 at 1:48 AM, Christian Stimming <stimming at tuhh.de> wrote:

> Am Mittwoch, 6. August 2008 18:43 schrieb Charles Day:
> > On Thu, Jul 31, 2008 at 5:13 PM, Charles Day <cedayiv at gmail.com> wrote:
> > >> Sorry, yes, you're right. Here's a corrected second table:
> > >>
> > >>  round force_fit decimal  non-decimal
> > >>  ===== ========= ======= =============
> > >>      0         0   0.999       0 + 1/3
> > >>      1         0   1.000       0 + 1/3
> > >>      0         1   0.999         0.333 *a better example might be 2/3
> > >> (prints as 0.666)
> > >>      1         1   1.000         0.333 *a better example might be 2/3
> > >> (prints as 0.667)
> > >
> > > While I'm at it, shall I make 1/3 print simply as "1/3" instead of "0 +
> > > 1/3" in the first two cases?
> >
> > Can anyone confirm the intended meaning of the force_fit option? Shall I
> go
> > ahead with these changes?
>
> I can't confirm the *intended* meaning, but your explained meaning makes
> perfect sense to me. IMHO you can go ahead with these changes.
>

When reading through the code again, I realized that "force_fit" works
slightly different than I thought. Without "force_fit" turned on, any number
of digits will be printed. So I think what I will do is just make fractions
always print as fractions and rounding will not work on them.

If we need to display non-decimal numbers in decimal form, using either
truncation or rounding, then I think we need to add a new option of
"force_decimal". If you want me to add that option, let me know. Below is
the corrected (again) before and after.

Let's say there is a decimal value of 9999/10000, a non-decimal value of
2/3, and max_decimal_places is 3. Depending on how you set round and
force_fit, you CURRENTLY get the following output by calling
xaccPrintAmount():

round force_fit decimal  non-decimal
===== ========= ======= =============
0         0  0.9999       0 + 2/3
1         0  0.9999       0 + 2/3
0         1  0.999        0 + 2/3
1         1  1.000  0 + 4003/6000

After patching, this is how it would work. Only the non-decimal column is
different:

round force_fit decimal  non-decimal
===== ========= ======= =============
0         0  0.9999           2/3
1         0  0.9999           2/3
0         1  0.999            2/3
1         1  1.000            2/3

If we add a "force_decimal" option (and I don't know that this is needed),
this is how it would work. Note that "force_decimal" implies using
max_decimal_places on non-decimals:

round force_fit force_decimal decimal  non-decimal
===== ========= ============= ======= =============
0         0             0  0.9999           2/3
1         0             0  0.9999           2/3
0         1             0  0.999            2/3
1         1             0  1.000            2/3
0         0             1  0.9999         0.666
1         0             1  0.9999         0.667
0         1             1  0.999          0.666
1         1             1  1.000          0.667

So for now I will just write a patch to go from the first table to the
second.

> Regards
>
> Christian
>

Cheers,
Charles
```