2015-06-20 4 views
1

Я работаю с json на C++ и решил попробовать Jsoncpp. В моем json у меня есть некоторые значения, которые находятся в научной нотации и содержат отрицательные показатели, такие как 4.0e-06. Когда я иду разбирать эту строку json, я получаю странные результаты. Библиотека, похоже, работает нормально на позитивных экспонентах, но не работает, когда появляется отрицательный знак.Jsoncpp не читает показатели правильно

Ниже приведен пример кода, который я использовал для проверки этой строки json.

#include "json/json.h" 
#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 

    string json_example = "{\"test\":4.0e-06, \"test2\":0.000004\"}"; 

    Json::Value json; 
    Json::Reader reader; 
    bool parsed = reader.parse(json_example, json, false); 

    cout << json.toStyledString() << endl; 


} 

И это результат, который я получаю.

{ 
    "test" : 3.9999999999999998e-06, 
    "test2" : 3.9999999999999998e-06 
} 

Я не могу сказать, является ли это ошибкой в ​​библиотеке или если я делаю что-то неправильно. Я попытался использовать более старые версии Jsoncpp и по-прежнему пришел к той же проблеме.

Благодаря

ответ

1

Это не вина JsonCpp, всего проблема с изображением этого числа в формате double. Вы можете проверить это сами:

double a, b, c, d, e, f; 
a = json["test"].asDouble(); // 3.9999999999999998e-006 
b = json["test2"].asDouble(); // 3.9999999999999998e-006 
c = boost::lexical_cast<double>("4.0e-06"); // 3.9999999999999998e-006 
d = boost::lexical_cast<double>("0.000004"); // 4.0000000000000007e-006 (!) 
sscanf("4.0e-06", "%lf", &e); // 3.9999999999999998e-006 
sscanf("0.000004", "%lf", &f); // 3.9999999999999998e-006 

... Но как ни странно, когда я преобразовал JSON обратно в строку Я получил это:

std::string test = json.toStyledString(); 

//{ 
// "test" : 4.000000000000000e-006, 
// "test2" : 4.000000000000000e-006 
//} 
+0

Я вижу, я буду стараться играть вокруг с этим немного и посмотрим, смогу ли я получить тот же результат, что и вы. Хорошо знать, что это не библиотека, виноватая. Спасибо за вашу помощь. – EMG

+1

Вы можете рассмотреть [RapidJSON] (http://stackoverflow.com/a/29878756/833188), в котором рассматривается эта проблема – Sga

Смежные вопросы