C++中数据库值的句柄-0
Handle -0 from Database Value in C++
目前我正在编写一段C++代码,其中我需要从数据库中读取数据,如果数据库值为非零,那么我需要应用一些进一步的逻辑。
但在数据库中,有一些值正在计算中,可以得出-0.0
。这个负零在C++双变量中被视为垃圾值。我已经在构造函数中将该值初始化为0.0
。
样本代码:
for(Sample::List<BalanceSheet>::Iterator i((Sample::List<BalanceSheet> &) Balance.Entries()); i.HaveItem(); ++i) // This list is being populated from Database
{
if (SomeCondition != "")
{
if (i->GetBalance() != 0) // This is where am getting Garbage values since GetBalance() returns -0.0
{
DoOperation();
}
}
}
-0.0
对于double
是完全有效的值。你遇到的问题是,你在比较不平等的双打。
你应该做的是这样的事情:
i->GetBalance() > std::numeric_limits<double>::epsilon()
首先,您应该never使用带有浮点变量的==
或!=
。它们本质上是无意义的操作,因为浮点类型的限制意味着即使看似无害的值也可能无法进行相同的比较。2+2完全有可能不是4,至少就==
而言是这样
这里真正的问题是,你正在使用"零"值的符号,根据上面的说法,它最初可能并不完全是零,但更重要的是,使用标准比较运算符很难测试。有关讨论,请参阅此相关问题。
如果您可以访问C++11或支持它的编译器,最好的解决方案是根据Vlad对该问题的回答使用copysign
。此函数采用2个参数。第一个表示返回值的大小,第二个表示符号
#include "iostream"
#include <math.h>
using namespace std;
int main()
{
double posZero = +0.0d;
double negZero = -0.0d;
if( copysign( 1, posZero ) < 0 )
{
cout << "posZero is negativen";
}
else
{
cout << "posZero is positiven";
}
if( copysign( 1, negZero ) < 0 )
{
cout << "negZero is negativen";
}
else
{
cout << "negZero is positiven";
}
}
posZero为阳性
negZero为负
在本例中,copysign
根据第二个参数上的符号创建+/-1的值。出于您的目的,第一个参数可以是任何非零值,但也可以是1。
或者,您可以使用signbit,老实说,这可能更直接。使用此功能的上述版本:
#include "iostream"
#include <math.h>
using namespace std;
int main()
{
double posZero = +0.0d;
double negZero = -0.0d;
if( signbit( posZero ) )
{
cout << "posZero is negativen";
}
else
{
cout << "posZero is positiven";
}
if( signbit( negZero ) )
{
cout << "negZero is negativen";
}
else
{
cout << "negZero is positiven";
}
}
输出相同。
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- C++中数据库值的句柄-0