C++中数据库值的句柄-0

Handle -0 from Database Value in C++

本文关键字:句柄 数据库 C++      更新时间:2023-10-16

目前我正在编写一段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";
    }
}

输出相同。