Is using floating point type for money/currency a good idea?
    kdevel 
    kdevel at vogtner.de
       
    Mon May 20 19:20:01 UTC 2019
    
    
  
On Monday, 20 May 2019 at 11:47:25 UTC, Josh wrote:
> On Monday, 20 May 2019 at 11:10:32 UTC, Boqsc wrote:
>> https://dlang.org/spec/float.html
>>
>> I'm frozen in learning basics of D lang since I want to create 
>> a simple game and I really would like a clean and simple code, 
>> however to me floating points are magic.
>>
>> https://wiki.dlang.org/Review_Queue
>> Since std.decimal is still work in progress and apparently its 
>> development is stuck for a while, should I just somehow use 
>> floating point to store currency or wait until Decimal package 
>> will be finally included into std Phobos of D lang?
>
> Normally I would say no, no and no.  Rounding issues will kill 
> you every time.
Right. Say a chemical is sold at 3165 $/m³. A customer orders
1 ℓ. According to the "round to nearest or even" rule what is the 
amount
invoiced (no taxes)? For the non-SI world: 1 m³ = 1000 ℓ.
[...]
> 		writefln("%f", cast(float) i / 100.0);
[...]
Why cast the integer to float and then device by a double?
    writefln("%f", i / 100.);
accomplishes the same with less reading.
Back to the invoice: I would like to promote decimal here:
import std.stdio;
import std.math;
import std.conv;
import decimal;
void calculate (T) ()
{
    writefln ("\n%s", T.stringof);
    T price_per_m3 = 3165;
    T quantity = "0.001".to!T;
    T amount = price_per_m3 * quantity;
    writefln ("%.2f %.24f", amount, amount);
}
void main ()
{
    calculate!decimal32;
    calculate!decimal64;
    calculate!decimal128;
    calculate!float;
    calculate!double;
    calculate!real;
}
    
    
More information about the Digitalmars-d-learn
mailing list