首页 > 解决方案 > 为什么双类型在linux和windows之间看起来不一样

问题描述

对于一点背景,我目前正在将解决方案从 windows 转换为 linux。该解决方案本质上是使用 ODBC 通过根据需要进行读写来与 postgreSQL 数据库进行交互。我正在通过 Oracle VM VirtualBox 运行 Debian 构建。

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

有谁知道是什么导致它在 LINUX 上以这种方式四舍五入?我尝试将该值存储为 long double 以查看是否会产生任何影响,但效果不佳。如果有人有解决此问题的任何经验,将不胜感激。

正如这里所建议的,程序的一部分将重新创建问题......

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。

标签: linuxpostgresqlwindowodbc

解决方案


推荐阅读