当我运行它时,在main()中cout打印5.395。但断言说它失败了!!这真是令人难以置信,为什么会发生这种情况?
#include <iostream>
#include <cassert>
using namespace std;
const float A = 1.6;
const float C = 1.55;
const float G = 2.2;
const float T = 1.23;
char empty[18];
int arraySize;
void copyArray(char sourceArray[], char targetArray[], int size) {
for(int i=0;i<size;i++) {
targetArray[i] = sourceArray[i];
}
}
double getAvgDensity(char aminoAcid) {
char aminoUpper = toupper(aminoAcid);
aminoToArray(aminoUpper);
double counter = 0;
int codonTotal = arraySize / 3.0;
if (arraySize == 0)
return 0;
else
{
for (int i = 0; i < arraySize; i++) {
counter += charToDouble(empty[i]);
}
return (counter / codonTotal);
}
}
int main()
{
cout << getAvgDensity('A') << endl; // prints 5.395
assert(getAvgDensity('A')==5.395);
return 0;
}
编辑:感谢所有答案,我只是乘以1000,转换为int,转换回double并除以1000. :)
答案 0 :(得分:10)
例如,假设getAvgDensity()
的实际回报为5.395000000000000000000000001
。技术上不是== 5.395
,是吗?当然,打印会丢弃所有那些讨厌的尾随小数,但价值仍然不同。
使用浮点数时,你必须自己决定什么是“平等”的可接受定义。手动舍入数字,或将其与<=
/ >=
和合适的误差范围进行比较。
答案 1 :(得分:1)
这已经得到了解答,但我会加上我的两分钱。如果您打算经常这样做,您可能会发现制作一个比较双打的功能很有用。我们的想法是检查fabs(a-b) < epsilon
epsilon
哪里是bool is_equal( double a, double b, const double epsilon = 1e-5 )
{
double c = a - b;
return c < epsilon && -c < epsilon; // or you could use fabs(c) < epsilon
}
是一个代表可容忍的误差量的小值。
assert( is_equal(getAvgDensity('A'), 5.395) );
然后就是这样做的一个例子:
{{1}}
答案 2 :(得分:0)
原因是cout默认情况下不会打印到那么高的精度。请尝试以下方法:
int main()
{
std::cout.precision(25);
cout << getAvgDensity('A') << endl; // prints 5.395
assert(getAvgDensity('A')==double(5.395));
return 0;
}