Convert to money as last as possible
Re:Beware of Fast-Math
by roryirvine on Saturday May 31, 2025 @01:32PM
(#44145773)
This is surely the right answer: simply count the number of tokens used, and do the billing reconciliation as a separate step.
As an added benefit, it makes it much easier to deal with price changes.
Fixed point Decimal is your friend here. I’m guessing you buy tokens in increments of 1,000,000 so it isn’t too much of an issue to account for. You can then normalise in your accounting so 1,000,000 is just “1 unit,” or you can just account in increments of 1,000,000 but that does start looking weird (but might be necessary!)
No, billing happens per-token. It’s entirely necessary to use billionths of a dollar here, if you don’t use floating point.
In which case, I’d look at this thread https://news.ycombinator.com/item?id=44145263
Re:Beware of Fast-Math
by marcosdumay on Saturday May 31, 2025 @10:30AM
(#44144516)
Accounting happens on the unities people pay, not the ones that generate expenses.
But you probably should run your billing in fixed point or floating decimals with a billionth of a dollar precision, yes. Either that or you should consolidate the expenses into larger bunches.
You're better off representing values as rationals; a ratio between two different numbers. For example, 0.0375 would be represented as 375 over 10000, or 3 over 80
Sounds hard to model in SQLite.
Re:Beware of Fast-Math
by freeone3000 on Saturday May 31, 2025 @11:35AM
(#44144939)
You need two fields, a numerator and a denominator. The denominator can stay fixed as long as openapi’s billing stays fixed.
Re:Beware of Fast-Math
by teaearlgraycold on Saturday May 31, 2025 @11:38AM
(#44144961)
Two columns?
From Forth, here's how I'd set the rationals:
: gcd begin dup while tuck mod repeat drop ;
: lcm 2dup \* abs -rot gcd / ;
: reduce 2dup gcd tuck / >r / r> ;
: q+ rot 2dup \* >r rot \* -rot \* + r> reduce ;
: q- swap negate swap q+ ;
: q\* rot \* >r \* r> reduce ;
: q/ >r \* swap r> \* swap reduce ;
Example: to compute 70 * 0.25 = 35/270 1 1 4 q* reduce .s 35 2 ok
On stack managing words like 2dup, rot and such, these are easily grasped under either Google/DDG or any Forth with the words "see" and/or "help".
as a hint, q- swaps the top two numbers in the stack, (which compose a rational), makes the last one negative and then turns back its position. And then it calls q+.
So, 2/5 - 3/2 = 2/5 + -3/2.
Ethereum is 1e18 or 1 wei.
https://ethereum.stackexchange.com/questions/158517/does-sol...
Should I be running my accounting system on units of 10 billionths of a dollar?