Value of floating in JSONValue

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Aug 21 16:05:48 PDT 2014


On 08/21/2014 11:53 AM, nrgyzer wrote:

 >      double d = 1.23456789;
 >      JSONValue j = d;
 >      sendToRemote(toJSON(&j));
 > }
 >
 > My problem is that the remote PC receives 1.23457 instead of
 > 1.23456789.

I think it is due to the following code simply calling to!string in 
std/phobos/json.d:

             case JSON_TYPE.FLOAT:
                 json.put(to!string(value.store.floating));
                 break;

 > But when I add the following:
 >
 > import std.json;
 > import std.stdio;
 > void main()
 > {
 >      double d = 1.23456789;
 >      JSONValue j = d;
 >      sendToRemote(toJSON(&j));
 >      writefln("%.8f", j.floating);
 > }
 >
 > writefln() shows me 1.23456789. So, the value is correct.

It is more precise but still not correct because that specific double 
value cannot be represented exactly.

 > Is there any chance I can send 1.23456789
 > instead of 1.23457 to my remote PC?

You can call a function like the following:

import std.string;
import std.json;
import std.stdio;

string morePrecisely(double d)
{
     return format("%.20g", d);
}

void main()
{
     double d = 1.23456789;
     JSONValue root = [ "value" : d.morePrecisely ];
     writeln(toJSON(&root));
}

Of course do something more sensible than hard-coding the 20 in that 
format string. :)

 > Note: I cannot use strings because the other PC expects a numeric
 > data type.

I don't think it is a concern as JSON does not encode types. It is up to 
the receiver how to interpret the data. Here is the output of the 
program above:

{"value":"1.2345678899999998901"}

Ali



More information about the Digitalmars-d-learn mailing list