string to real conversion losing data

Ali Çehreli acehreli at yahoo.com
Thu Apr 8 18:33:30 PDT 2010


jicman wrote:
> Greetings and salutations!
> 
> Will someone be so kind as to explain why this is happening?
> 
> ----
> import std.stdio;
> import std.conv;
> 
> void main()
> {
>   char[][] strRealVals =
>   [
>     "14539.34","1230.00","361.62","1613.10","","","0.00"
>   ];
>   real rTotal = 0;
>   foreach (char[] s; strRealVals)
>   {
>     writefln("Real value is: " ~ s);
>     real r = 0.00;
>     if (s != "")
>       r = std.conv.toReal(s);
>     rTotal += r;
>   }
>   writefln(std.string.toString(rTotal));
>   writefln(rTotal);
> }
> ----
> 
> When I run this program, I get this:
> 16:51:35.54>realtest
> Real value is: 14539.34
> Real value is: 1230.00
> Real value is: 361.62
> Real value is: 1613.10
> Real value is:
> Real value is:
> Real value is: 0.00
> 17744.1
> 17744.1
> 
> ----
> 
> If I add these numbers, the outcome should be 17744.06.  Any ideas?  I am using Digital Mars D Compiler v1.046.
> 
> thanks,
> 
> jos�
> 

The default format string for floating point values is 6 decimal digits 
of precision (the digits before and after the decimal point). writefln 
is rounding the value up.

Try for example "%.18f" for 'real'. This does it automatically:

import std.stdio;
import std.string;

void main()
{
     auto theValue = 17744.06L;

     writefln("%s has %s decimal digits of precision",
              typeof(theValue).stringof, theValue.dig);

     auto formatString = format("%%.%sf", theValue.dig);
     writefln(formatString, theValue);
}

Ali


More information about the Digitalmars-d-learn mailing list