linux - 为什么双类型在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。
解决方案
推荐阅读
- angular - 如何使样式或样式表可用于子组件
- xamarin.forms - 在 23 之前的版本中,什么等同于 LayerDrawable.SetLayerInsetRight?
- amazon-web-services - 如何使用 amazon lex 保持转换的上下文?
- debugging - F# FSI 在内联函数内没有中断
- git - 具有 rebase 的 SourceTree 完成功能 - CLI 等效
- java - 调用具有大数据大小的 post rest api 时引发错误
- java - 读取 Iris 数据集并存储在二维数组中
- tensorflow - 张量流中的训练和测试
- php - Mysqli 建议,可能使用 concat() 进行 1 或 2 个查询
- java - 来自 YearMonth 和第 n 天 DayOfWeek 的 LocalDate