Proposal for modifying gnucash to use exact quantities

Bill Gribble grib@billgribble.com
27 Jul 2000 13:00:18 -0500


Steven Murdoch <sjmurdoch@linuxfan.com> writes:
> Say I buy 10 shares at 123_1/64 pence each. Gnucash will represent this
> as 7873/64 pence per share so the total transaction value will be
> 78730/64 pence. My dealer will pay the seller of the shares 1231 pence,
> and I will be billed for =A312.31 as sellers round up.
> Gnucash will then remove 78730/64 pence from my share buying account and
> correctly display this as -=A312.31.
> Say I then repeat this transaction a further 6 times for some reason. I
> will be billed =A312.31 * 6 =3D =A373.86 so I will be =A386.17 in overdra=
ft.
> I enter this information into Gnucash and it removes 78730/64 * 6 from
> my account so I am 551110/64 pence in debt. Gnucash will then display
> this as -=A386.12 which is *not* the same as my bank balance.

Since your bank does transactions in integer SCU, each transaction
will be converted to the SCU-denominated amount on each transaction.
This is not a modification for display, as you imply, but an actual
change in the result of the multiplication to the correct
denomination; therefore, the summing operation is performed correctly.=20=20

Conversion from an exact result to the correct denomination is lossy
in some cases, as fractional cents get lost, which is why there are so
many options for the last argument to math operations... you want
control over whether rounding is up, down, banker's, etc.

As you correctly notice, it doesn't make sense to keep "exact" values
that aren't "exactly" what happened in the transaction; what's
important is to represent what's really going on.

Below I include the actual code for gnc_numeric.  It has several test
cases in a a main() at the end which will demonstrate what I'm talking
about.  You can compile it with something like
=20
  gcc -o gnc-numeric-test `glib-config --cflags` gnc_numeric.c `glib-config=
 --libs` -lm

Please keep in mind that there are several features suggested by folks
on the list that haven't been added yet, but will be soon.

Thanks,
b.g.

begin 664 gncn.tar.gz
M'XL(`+IW@#D``^T<:W/:2#*?^15]V4H6;,`(OQ(_DO/ZD;C.L5/$WKW4W842
M8@!5A,3J8:_KDO]^W?.01@_`V.`X5TP<&S0S/=3DT]_9J9UO1=3DJ^U&0^;;5MUZ
MMIC2,!J-K:V-9XU&P]C>;.A_L6PVMIN;SQK;QCK^-(TFMC.:QN;V,V@L")]4
MB8+0]`&>]7V[,ZG=3DM/J?M*RMS*&48`7ZNB!!K0:F"^POTPIK^+3#?'#LCF_Z
MM]#S?&P<668PJ(-6.)1#;W3KV_U!".7#"C11/.`WVW'@'7*_XS"86CB4!Q<.
MY7)@!S#RO;YO#@$_]GS&(/!ZX8WILUVX]2*PD$B?=3D>T@1/RBD($=3D(MW=3D-211
M01EZ7;MW2Q61VT4VA`,&(?.'`7@]_N7=3D^16\8R[S30<^1AW'MN#,MI@;,#`#
M!65$%<&`=3D:%SRWN=3D$#*?)#)PXB%P,[0]=3DQ>8C?4^7#,_P._0I'$D%.HH85<!
M<2R;(9'A@S>BOA7$_18<,TRZUPOXLACN)DSL@NUR5`?>"'DU0"21>S<D!AT&
M4<!ZD5.54+`]_'%Z^?[BZA(.SC_#'P>MUL'YY>=3D=3D;!\./*QEUTQ`LX<CQT;@
MR##?=3D,-;C2\?CEN'[[';P6^G9Z>7GXDU)Z>7Y\>?/L')10L.X.-!Z_+T\.KL
MH`4?KUH?+SX=3D(V,^,<8!*R@3)I)D?NCA1'59:-I.4!_/E_EP]S,*9X#T.UT8
MF-<,A=3D1B]C52;X*%*C9=3D]C@4T_'</N<DMDZF:Q?L'KA>6$58;H@JOC,1E_E0
M-$[@M7:_>X@[XK)JU+:,[=3DKF1K.V^7JCJ4/9?`V7#`6!P4?'M!C4X%-DH]ZN
MKS<4E!/S+TZ/!J6YM9F"\IL7A)Y;A0\'`(VF81@U8[VQC3)Y]>E`MD,+]W?\
M7_?\_D+Y\O"R5BK]8KN6$W49[/712M<';[0G0=3DBUO?2CH1D.TD_,(&!^2,^2
MA\]UCS!X7BJMH=3D)?'%T`T5XC/082+[0UMDL&$<TH6AZX-IV(!1!Z,#2_,K1,
M*)PTSX%@V=3D9&K6.'-0_M4\_Q;FHHDBC+`J0<K!UZ[:Z'TLSJ]3J9%K*':$S1
M>H1DVF[,V[>RA]DEC2##X_:IFX2`E<@5#`Q"5(@^HK>UH?NWMF-UR]IW,*MZ
M-70JNT3M'`JG61\9$9[+I!-]&MQ29HR)U%61>9DB>=3D1EKC=3D,M6[[I*CM$&WY
M307^6TI1`T$TW,5'^&/W]"';UH!97\MF!;Y]@_SS3D6``K1?A^WS*S3?IX?M
MXU;KHE6F)_Q3^Z#UKD+0OY<$?(X<[._S3D?'YQ<?VB>G_SP^4K"PB5F/&W7$
M1U4)(&M`MMGEC[_SW\Q!65;M)J$D1CTZ/3FI)/TY?J@;?1;&,1-^"&Z8C^(;
MF$,FQK9=3D,T0W(N09+>]PB,8/HRA61VF5/!Q/`+*ZCESD!-#?56S@1I(,JDSH
MDX\)-XTR!0!4FQ4Y@@*UDN),&B3_I#I,F92SPWA*%("L[J%$=3DBH*1_SQ61CY
M;EI2/!=3D-1%A&/*I*+DD&=3DR=3D:U!+BM2#-#:+.PC47QW@DS<68MK=3D;6BKNXA67
M.)W2W)JNN;QVFNK&(/*Z6RO2W0S0`N55-OO!ZCM9>0F1IZ&]P\A9N/;B&(^D
MO1@T=3D2,K7/I>CI_D1DY#I#*IZ@D*\2C*(/%X&OK0M:\7K@\XQB/IPY^1%]K,
M72J$P$^QH]AG[.HM\DKA1H^G$@J-C$XL4.[ER`N7?46A+J6V6[VO@'L1EVW9
MFQ>?#4V;=3DB1W^63I58'=3D=3DR>I@NW.*/,<5'!CA]:@K$DRQ4":9!S_\^#P<J<D
MD.-S;KM",CL^,[_R<#/3I75\=3D'5X+/I@).8SM)!B4\YV1U%(NP@F/G5P(7_-
MG-O:R+<Q*NOY&*G1UA'.@#9:BIL<$E&:Q:#+>F;DA/&8?)<BB'P&-PQ<QKHT
M:-?C2-QX_E<U"'+2=3DA.5SBATAF"ARFH(A&8Z#H<X1!_@>+3'3+LF&*E=3DVWR7
M%W]&7F`3F9D=3D%#$`[?W:;C]`=3DCAV&#H8ASK,]#%25?C1I`M<]H$P)=3DW?@T8%
MWD+-@!TP!&8H2;%9D*U60#-">GU9?5%PU/<=3DU6RWE!)%[*.:O`#%K3Q<]7FM
MH(VR*?*Q8GTRQ!O"1;%=3DRF2L,U1B$6N=3D'[5/SBXN6CNQGT%(G$][.A`=3DO02Y
M5<6Q9#[3@I0;Z_#X]"P_U)N'#J6^%@UYV;HZ/]RY"W*MBZOSHQ1VY2:L)%-7
M0435;,P'W_%8<US:[P_.3MI7'R?CM#\GI(K0.#_^_5B3#514FC#3X8M!W\<E
MGUC>%5#W/:OE"3[:K+^%1&'*2GFD02JE8'Y/_"0W]8MS@.B?^;,3Y#"W2&A&
M@E"M:G$)$]JTNR[/%[3U+S_OXEU-;K[FN!O"75<I&T5,W*`5'E+X/"OR?0PB
MVMR8>F2$FIJS')I_M8,_(SKR2QZ&`Y\Q=3D-(1VN!]:&@UP1!-=3D3LV2O)IQ^ZW
M$XMTS_A23G#*P::7XVI5OZ?BL7CW+\$*XG!2>C:%6CJ<S.[^I0"8XP!D=3D_A(
M)T;,LE$I2'5V!!RTPL3K+CJI8.AYX<"Y)6_F@6/Z=3D![`/1)I<P+ZA8Y!A1QH
M(\,6C<4Q2Y*Y0]PR,R.PXR>BAQ_0O_8]WPX'I&HA>72JB%SN6H4HR]`!(P<I
MR_B0QD<8-^B0??*M*-92`_@A[1!]<)_1Z4,=3D+F508`=3D5"A1Z4GT$A""R+!8$
MY+R+ADFXIFTGT6#,L?E7A0@-V?.175PQ!3.U/E5Z[J90C$%W;F,8TH#&HPM`
M,E"X&=3D@.*V=3D59B6G1'O[&O>U54VYK(O2BVP_-;4O7RK#F9:"XN:);4\)8_QY
M+=3DMO[((),<R9`[0'NO/(U*^NIHVZ!(B`4D9B']81"(R#`JO[L)'XG[1],0I'
M&(L1P6H6PLKBJCD@FIHLG#=3DII?OV+9Z3?,N8V?ID)"[O>Z*44E]U,5A)&4C>
M;D'N2\3U_+%<+)C)<J!S"^\.3V*M$ND//$\!?\XO+E&#79Z487(`(],/E8Z8
MW'@P.B\\^'B*EL-!?<XM5`@.MX<]2D00SE#L"J/7IO6*IJSUA:\QY1HGO<2D
MV=3D.7@Y.=3D(Q2[1P`9RZ37$>6:7#)4T,K*JE0OI;EZ6$_+G`*=3D$#XWO\1-S'H0
M^F@9^[=3D\X]U+;*6*592-Y093&+\F1"-J^RM2]2O::7YNC)_5WKTREFFS+/KJ
MTA!+E"F#I.#/I%+:9=3D4^,;NJ%Q<Z'/E7%#0G$"M)W8LJ0-)W)#C%PQ+L`#H,
M5WP\X4.CMRYZB=3D\WE(J$T1NEIS0YLNOHF?P@K"K,48-[=3D&8>?+5'?!'*TVE$
M1E<@@%!+JO&ZL?=3DCW'>L0YF2=3DY`,[.23N[']+F\F^E=3D%?[O.ZO"Z"L9F%9I&
MA9Q4)-BMSW@01KT>]T%%807I98`!11Q7$)KHX62RE,<SHN*P@N3NC5J!OWP)
M9;'@C-?FB4,18BS6FOH!B913(Q4IV3T0L/?V=3D>#*=3D7%8.O#44A4'B-?#8E1C
M7""3QO^M[+^C^@O^N)X_C-G#)[DIW?]Z%9#3V\APHPHLM*1$E/D4IR90BD1E
M3IY?<+G`O:;]_1A7G_7T^M04>O<\@Y=3D!P+V"`&ZP)SK_NSG^M15N)RS3L2)'
MY/0`233WJOH&EDMG]H'M6I1/B>;#]<+88"&`+L/HF1+Y*#,0U=3D9#:24+YK*^
MJ6^`<:E-[4?EW)'T15)S"O:/<LOJ^84E(D6)LHYT![T(IU\X4ED\??"N,G?1
MW&>3$1%`*\E:-[O#-FYW3=3DL`$=3DA4>H[G^44[L&,VS?(0+&8[4P%H6V!Y")D-
M:*DHQ1MCT[:H\M!]_#,5/VV7:2J/^!XS_&T_G@?5)5'-PETJS0ZDMI3NHA`+
M"M3C'+ZY:80$5SA(01`<$ZIX*8S'FO95LF2!ITTX&>'\.##VL(D/(V5*6%_=3D
M(HP]3DKD<08#NKC$R#8E*K>Y3#]&CJ0VW*S'U%JYD^FM3H2@#;8B5%HMXM*I
MEMP'9A,]Z:PU?7R:Z2C2FL9US)S>5=3D&SY@#X?FYD2E3CF7D<>@&8201K18R&
M9B\FFYZN"+NV3T-G=3DL=3DYQNE<W7B&K,<4PO1P/X$04CY7D2C<2PB3C@\00I%A
M-DX*9Q8OD1:YT#2TQQ2P]'`_@8!1CE1VFBFM[EX"EG1\@(`11G,4,`*W2`'#
M-=3DUC"EAZN)]`P"CC*#O-E*=3DV+P%+.CY`P`BC.0H8@>,"A@Q-!XG\-+(H3M8S
M6][DSN62X\J+?Q0<+,:)+_K)(<FW>OW&&IBX1$FA,N(+IR)41&,">FTZDO*)
M^4MFP('URB]%GRH\W^/8OH%_O7"<+JP!_?G/\ZK<L*XF"06[D">G`-[=3DX4A>
M*.SE)-!97)EVP4V_;U4EB2OT[3H?F9L9"9&AO5&%]9Q$=3D<:VW<BUM;(/NF,[
M-RMR%S(CO6HSW]X52;><3<_I#2RA&SOP(H!5^K6/O_[M/M?4-3_[9J5:\+13
MF=3DCICC'L'8-/7E);&94*O?F5H4XD2#P!ZL09U(/)2U-G-!KA(/AQY.'X$\WZ
M=3D(+$EDY^A:,[IF2L-(`JO,0&'$B>*6O"RJ99@Y^4+28^+813UN1JPEC1K;!&
M3Z*K8>W19G)"%#\W.27B-"W\L<3-70N).ET+?P1Y#]?"`AW,+&]GT,&$);H.
MUIZX#N)Z0]?!E4>;QPD+G;E)*1&GZ>"/)6[N.DC4Z3KX(\A;B`YF=3D@!FT,&$
M);H.KCQQ'<0EF:Z#:X\VCQ/6@G,(;W3R-"W\L>3-1PMS].EZ^",(?+`><HH*
M=3D#&S63*#+B9LT75Q[8GKXO::L47Y<3W',T/$F(U'K/`@3ZU)*=3D5E*R\K"KR4
MES(_2ZWLW$%84F/D7]1*CSN3+%#)SZC$?1SB=3D,S]U/"F8_DI:(=3D^Y%I/#6^>
M#3`%<;ZC^-00YPD'&<2Q0:.YWES?0%5?7]]H&EM;FQLR[[4[*_[Y;-%XST>.
M<G8V,PGY$N-Y1O*3(J?YQ6BLK-,O8_M+$VEJ?GE%WYLSD)14W96X[0W\U]QX
MM74O^HSUK<;&JU>OM_+D&(TF30S]^3++K,Q.`HYP+]P;KU]O&L96<WM[NP!_
M/B!EF)(<TD5]H3UDP0[W'[QACU)3>*HNV+!'S;#@Y]55M?NZX"E(,3]^)T7?
MJ#D[_##;SE6GT/=3DU9]NYHI,"/1`Z.SRZ5\3`4X-4Y"XWCQNT;SS#_8\:;O7!
M@NZ8G'S_IV$T#'7_YT9SL[G-[__<,I;W?SY&6<C]GX/E_9\QE.7]GW?C[O+^
MS^7]GY.@+.__+(3R\,+O_^RA;>I!NZW?Y_&^W2[](I+M"VI*J*Z1%8*>4ZZ_
M5:UR0M57E2R+P4IX.V(T7!$$[;/6DN$C\>)$9JM#7V]F5G%5K35?'6462RH[
MNZJ#Y2%5Z7M1!@FBH[B1V:(#J!D%=3D?*=3DOUH3"BHQYJ,IK*T7U/&;@+!N(SVB
MRJ+01:!1T.*@]2YI4#/$BQ=3D^'ZEQ0[0&0?RBQ%HC]48Q2D+!<,@/Y/4?`EB3
M`XOO9(4;;F'49:S%$))[ACB]'(*@,'D5LJ/>?0QX"IUX6:LD7^2C5Z+%BR%B
M\VIH6KZ7'2M]"0W/EJD47ATDUA0-7$E0HPI_TU1<XF*F,A;X:X'\2_RZ=3D899
M8\1V:CHUOQQ6?V,TN>-V$MA[7,NJE[N]X[$[=3DOA[W"TYS^'O<3G>/(>_QUUD
M]QD^(QB]R+6$7'`?+`XFA!((T9XF,'=3D.KKOK\O/A>78I:!H.*N=3DNH@3^7]$S
M2W;MST#/+,F<3XD>4CIK8+I]EKVSAL+DM%?@KQ9.-/YWNKAM*L(33,24D<=3D-
MP3V0F([/3-M6D[C/K*]\D22,FWQ##9>!BM]0BN\!R&"3STLU)51YP4/^5H=3D)
M\U=3D\*8)$4W"8WRJ'X0"/$/CAE.WV:R./,$Q>/=3D4AS/@"YEUF9KR`2+"Y5F-?
M=3DJ/`EKD8=3D\VR;[@LR[(LR[(LR[(LR[(LR[(LR[(LR[(L/T_Y'\*N^/\`>```
`
end