Hi all,

I'm building a budgeting system for home use, using XSLTForms and -- ready
for it? -- BaseX!

sum() has been behaving weird. I'm adding USD, which means only 2 decimals
of precision. But depending on the combination of elements I add, I'll get
a long double that's inaccurate. Sometimes it returns what I expect,
sometimes it doesn't, but either case is repeatable.

Take these 3 receipts:

1 --
<receipt uuid="694bf777-2d40-42ad-9809-97dfe6b04f40">
  <metadata>
    <date>2020-06-08</date>
    <store>
      <name>Frigid North</name>
      <location/>
    </store>
    <purchaser>Jay</purchaser>
    <account>Debit</account>
    <category>shop-general</category>
    <net-total-computed>6.50</net-total-computed>
    <tip>0.00</tip>
    <gross>6.50</gross>
  </metadata>
  <item>
    <name>Start Capacitor (for old rockwell saw/jointer motor)</name>
    <cost>6.50</cost>
    <qty>1</qty>
    <total>6.50</total>
    <category>shop-general</category>
  </item>
</receipt>

2 --
<receipt uuid="2eb74e82-3db5-4bd9-a591-8621c79f3fd6">
  <metadata>
    <date>2020-06-09</date>
    <store>
      <name>Home Depot</name>
      <location>Tudor</location>
    </store>
    <purchaser>Jay</purchaser>
    <account>Cash</account>
    <category>jay-misc</category>
    <net-total-computed>9.87</net-total-computed>
    <tip>0</tip>
    <gross>9.87</gross>
  </metadata>
  <item>
    <name>Stainless Protractor</name>
    <cost>9.87</cost>
    <qty>1</qty>
    <total>9.87</total>
    <category>jay-misc</category>
  </item>
</receipt>

3 --
<receipt uuid="1f1462e6-b37f-4daa-b293-29b9ec353627">
  <metadata>
    <date>2018-09-16</date>
    <store>
      <name>Title Wave</name>
      <location>Midtown</location>
    </store>
    <purchaser>Franny</purchaser>
    <account>Debit</account>
    <category>books</category>
    <net-total-computed>20.85</net-total-computed>
    <tip/>
    <gross>20.85</gross>
  </metadata>
  <item>
    <name>Music of the Spheres</name>
    <category>books</category>
    <cost>6.95</cost>
    <qty>1</qty>
    <total>6.95</total>
  </item>
  <item>
    <name>Magic Mirror of M. C. Escher</name>
    <cost>8.95</cost>
    <qty>1</qty>
    <total>8.95</total>
    <category>books</category>
  </item>
  <item>
    <name>Daumier 120 Great Lithographs</name>
    <cost>4.95</cost>
    <qty>1</qty>
    <total>4.95</total>
    <category>books</category>
  </item>
</receipt>

When I sum the <gross/> elements:
sum 1 & 2 = 16.369999999999997
sum 1 & 3 = 27.35
sum 2 & 3 = 30.72

What makes certain combinations return such crazy numbers?

I did find one other thread in the mailing list about this, it got an
answer but didn't really explain much. I have a schema for prices in the
XForm, should I be loading that somehow? The only workaround I have now is
like, "let $grosses:= for $gross in $receipts//gross return
xs:decimal($gross)" but I'm hoping there's a more straightforward way.

Not sure if this is implementation specific or if it's not defined or what.
If I should ask elsewhere, please let me know :-)

Be well,
Jay

Reply via email to