C++ 将它们添加到C+;中JsonCpp模块中的数组后出现错误值+;

C++ 将它们添加到C+;中JsonCpp模块中的数组后出现错误值+;,c++,arrays,loops,for-loop,jsoncpp,C++,Arrays,Loops,For Loop,Jsoncpp,在向jsoncpp数组添加值后,我遇到了问题。下面是我的代码: #include <iostream> #include <cstdlib> #include <fstream> #include <string> #include "jsoncpp/dist/jsoncpp.cpp" #include "jsoncpp/dist/json/json.h" #include "jsoncpp/dist/json/json-forwards.h"

在向jsoncpp数组添加值后,我遇到了问题。下面是我的代码:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

#include "jsoncpp/dist/jsoncpp.cpp"
#include "jsoncpp/dist/json/json.h"
#include "jsoncpp/dist/json/json-forwards.h"

using namespace std;

void printArray(const char *measure, float **arr, int rows, int cols)
{

    int i,j;

    cout << endl;

    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;


    if (measure == "ECG")
    {
        int i,j;

        Json::Value ECG;
        Json::Value time(Json::arrayValue);
        Json::Value values(Json::arrayValue);

        for (i = 0; i < rows; i++)
        {
            for (j = 0; j < 1; j++)
            {
                time.append(Json::Value(arr[i][j]));
            }
        }

        for (i = 0; i < rows; i++)
        {
            for (j = 1; j < 2; j++)
            {
                values.append(Json::Value(arr[i][j]));
            }
        }

        cout << endl << time << endl;
        cout << endl << values << endl;

    }
}


int main()
{
    int i,j;
    int rows, cols;
    const char *measur;

    rows = 10;
    cols = 2;

    float **array = new float *[rows];
    for(int i = 0; i < rows; i++)
    {
        array[i] = new float [cols];
        for(int j = 0; j < cols; j++)
        {
            array[i][j]=(i+j)/10.0;
        }
    }

    measur = "ECG";

    printArray(measur, array, rows, cols);    
}
如您所见,在向json数组添加值之前,一切都正常,但之后,会出现不同的值。现在它是一个数据测试样本,但它将是一个库,将从ECG、脉搏血氧计、气流等模块中获取数据。RapsberryPi的模块,因此“值”数组中的数据将类似于0.14453453、0.23546456等。我必须防止类似情况。我的价值观必须尽可能准确


谢谢。

浮点数和双数不能存储基数为10的数字。他们使用的基数2有时非常接近,但+/-值很小。关于浮点的Wiki:

通过使用sprintf或类似工具将浮点数转换回字符串,您通常可以在以后获得相同的值(用于显示目的)。看起来您正在读取1个十进制数字,例如:

 sprintf(stringout, "%.1f", floatin);

在比较浮点数和双倍点数时,请始终记住“不完全相等”这一事实。与其问“是x==y”,不如问“是x==y+/-某个公差值,如0.0001”

以更高的精度打印输入值,如下所示:

cout << std::setw(11) << std::setprecision(9) << arr[i][j] << "\t";

cout好的,我把floatarray类型改成了double,现在我的精确度提高了很多。对我来说没问题。现在,请告诉我,如何发送到只有8位小数的“值”表?我不希望数组中有值数据,比如values=[0.12121212,0.2121],但我只希望有这样的值,比如values=[0.1212,0.2121]。我想做的是在循环时切断“values”表中多余的信息。我的意思是,如何在向“值”表添加数据时设置数字限制。

字符串与浮点表示法。要么存储字符串,要么接受浮点和double并不总是与字符串完全匹配。它们将是+/-一小部分。好吧,这个技巧告诉我,即使我的arr中的数据也与它应该的不同。但你们可以看到,当我生成“arr”时,在主函数中应该有0.1,0.2,0.3,0.4等等。。。那么,如何获得更准确的数据呢?我是说。。。当我创建数组时,例如有0.9,但是在将它发送到函数后,在同一个地方有0.8999979761581429。如何预防?如何获得~10-15个数字位置的精度?以及如何将数据从arr添加到jsoncpp数组,精确到小数点后8位?好的,我只需将数组类型从float更改为double就解决了这个问题。现在我有了不同的问题-在向“值”表添加数据时如何设置数字限制?由于“双精度”,我的所有数据将精确到小数点后16位,并且我希望在for循环之前或期间减少多余的位数。@Fempter多余多少?没错,double最多可以存储16个十进制数字,所以这是最大位数,当然是指数的模。若你们不想用这么多的数字让用户尴尬,那个么这和存储无关,而是和用户界面有关。您可以使用
setprecision
相应地格式化字符串。是的,我想使用
setprecision
,但在for循环中。我想在这里使用它:
time.append(Json::Value(arr[I][j])
因为正如您所看到的,我在
时间
表中的数据不是我想要的。我想在
时间
表中添加精度为3的数据,但在
表中添加精度为6的数据。我该怎么做?@Fempter,这可不容易。我建议你开始新的问题。有很多可能做到这一点,如使用定点算法或将双精度变换为最接近的分数(如1/3、1/10等),但所有这些都需要相当大的努力,即使您使用一些库,您也需要好好思考如何使用它。
cout << std::setw(11) << std::setprecision(9) << arr[i][j] << "\t";