0

目前,我正在编写一段 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();
            }
    }
}
4

2 回答 2

2

-0.0是 a 的完全有效值double。您遇到的问题是您正在比较双打的不平等。

你应该做的是这样的:

i->GetBalance() > std::numeric_limits<double>::epsilon()
于 2015-11-30T15:13:38.267 回答
1

首先,您永远不应该使用==!=使用浮点变量。它们本质上是无意义的操作,因为浮点类型的限制意味着即使看似无害的值也可能无法进行相同的比较。2 + 2 完全有可能不是 4,至少==就识别它而言。

这里真正的问题是您正在使用“零”值的符号,如上所述,它可能实际上并不完全为零,但更重要的是,很难使用标准比较运算符进行测试。请参阅此相关问题进行一些讨论。

如果您可以访问 C++11 或支持它的编译器,则最好的解决方案是copysign按照 Vlad 对该问题的回答使用。该函数有 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 negative\n";
    }
    else
    {
        cout << "posZero is positive\n";
    }

    if( copysign( 1, negZero ) < 0 )
    {
        cout << "negZero is negative\n";
    }
    else
    {
        cout << "negZero is positive\n";
    }
}

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 negative\n";
    }
    else
    {
        cout << "posZero is positive\n";
    }

    if( signbit( negZero ) )
    {
        cout << "negZero is negative\n";
    }
    else
    {
        cout << "negZero is positive\n";
    }
}

具有相同的输出。

于 2015-11-30T15:43:00.253 回答