我只是对某事感到好奇。
我有以下代码:
if (d1 == 2.3)
cout << "2.3 is my value\n";
if (d1 == 2.2999999999999998)
cout << "2.2999999999999998 is my value\n";
VS2013 c ++ 11截图
它进入了两个ifs。我知道double的精度是15decimals,所以我将不得不为这种数据使用更合适的类型。
有人可以给我一个详细的参考资料吗?还有一种“方式”来存储“2.3”或更精确的数据而不是2.2999999999999998? (long double抛出我的complie错误
Error 1 error C2398: Element '1': conversion from 'long double' to 'const
std::complex<double>::_Ty &' requires a narrowing conversion...
感谢。
编辑:添加了复杂的
答案 0 :(得分:4)
这是浮点的本质 - 没有办法将2.3完全表示为浮点二进制。
第一次测试中的“2.3”无法用二进制表示,因此它存储为尽可能最接近的double
,即2.2999999999999998
。
换句话说,两个if
执行相同的比较。
答案 1 :(得分:1)
也许阅读这可能会对你有所帮助: http://www.cplusplus.com/forum/beginner/34088/
据我所知,除了您使用的编译器外,似乎没有真正的参考。试试http://msdn.microsoft.com 我认为2.2999999999999998正在四舍五入到最接近的双倍值,即2.3,或者反过来,正如另一个回答者所暗示的那样。如果你想要长文字,你需要在文字的末尾添加一个L:
//checks for equalty to a double
if (d1 == 2.2999999999999998)
cout << d1 << " == 2.2999999999999998 ?\n";
//checks for equalty to a long double
if (d1 == 2.2999999999999998L)
cout << d1 << " == 2.2999999999999998L ?\n";
btw:你为什么不用
complex<long double>