为什么在Windows和Linux之间双精度类型看起来有所不同

时间:2018-07-25 14:33:29

标签: linux postgresql window odbc

出于一些背景知识,我目前正在致力于将解决方案从Windows转换为Linux。该解决方案实质上是使用ODBC通过按需读写来与PostgreSQL数据库进行交互。我正在通过Oracle VM VirtualBox运行Debian构建。

出于某些(我不知道)原因,当从查询中获取数据时,在LINUX上执行时,我收到一个不同的double值。例如,如果我直接使用PGadmin查询数据库,我将得到一个像1.09933996200562(类型:double precision)的值,如果我使用ODBC从我的解决方案中运行相同的查询,我将得到1.09934(出于我的目的,这种略微取整是可以的) 。但是,当从LINUX上的解决方案中通过odbc运行相同的查询时,我得到了1.10237。注意:在两种情况下,解决方案都将返回值存储为双精度值。

有人知道是什么导致它在LINUX上以这种方式舍入值吗?我尝试将值存储为长整型,以查看是否可能有任何影响,但效果不佳。如果有人有解决此问题的经验,将不胜感激。

这里建议的是程序的一部分,它将重新创建问题...

void main()
{
    SQLHANDLE sqlEnvH = NULL;
    SQLHANDLE sqlConnH = NULL;
    SQLHANDLE hStmt = NULL;
    string SQLConnectionString;
    char connectionString[256];
    SQLSMALLINT numCols;



    SQLConnectionString = "Driver={PostgreSQL UNICODE};Server=localhost;Port=5544;Database=TSDB4;Uid=;Pwd=;";
    strcpy(connectionString, SQLConnectionString.c_str());

    if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvH))
        cout << "ok" << endl;

    if (SQL_SUCCESS == SQLSetEnvAttr(sqlEnvH, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
        cout << "ok1" << endl;

    if (SQL_SUCCESS == SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvH, &sqlConnH))
    {
        cout << "ok2" << endl;

        SQLCHAR retconstring[1024];

        SQLRETURN retcode = SQLDriverConnect(
            sqlConnH,
            NULL,
            (SQLCHAR *)  connectionString,
            SQL_NTS,
            retconstring,
            1024,
            NULL,
            SQL_DRIVER_NOPROMPT);

        if ((retcode == SQL_SUCCESS))
        {
            cout << "success" << endl;
        }
        else if(retcode == SQL_SUCCESS_WITH_INFO)
        {
            cout << "success with info" << endl;
        }
        else
            cout << "failure on connect..." <<endl;

    }

    if(SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT,sqlConnH, &hStmt))
        cout << "failed to alloc stmt handle" << endl;

    SQLExecDirect(hStmt,(SQLCHAR*)"select * from usp_getseriesparameters(1)", SQL_NTS) ;


    if(SQLNumResultCols (hStmt, &numCols) != SQL_SUCCESS)
    {
        cout << "no column numbers?" << endl;
    }

    cout << numCols << endl;

    if(SQLFetch(hStmt) != SQL_SUCCESS)
    {
        cout << "fail \n";
    }

    double retVal[256];
    double FieldValue;

    if ( SQL_NO_DATA != SQLGetData(hStmt,5,SQL_C_DEFAULT,retVal,256,NULL))
    {
        FieldValue = *retVal;
        cout << FieldValue << endl;
    }

    SQLRETURN retcode;

}

请注意,EXECDirect正在查询数据库中的表(第5列),该表包含存储为“双精度”的值。在Windows上显示1.09934,在LINUX上显示1.10237。

0 个答案:

没有答案