我试图检查double
变量p
是否大约等于整数。在我的代码的某些时候我有
double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;
对于给定的跑步,我得到打印输出
1 1
这似乎可以说1的小数部分是1,我在这里遗漏了什么或者是否会有一些舍入问题等?
注意:我不包括整个代码,因为p
的来源很复杂,我只是在问这是否是一个熟悉的问题
答案 0 :(得分:2)
可能会出现一些问题吗?
当然可以。如果该值略小于1,则显示时,其值及其小数部分可以舍入为1。
p
的来源很复杂
然后它很可能不是一个精确的整数。
答案 1 :(得分:2)
您正在测试接近1的值,因此15的精度不足以明确地描述它。
此代码清楚地显示了您的问题:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
using namespace std;
int main() {
double ip, d = nextafter(1., .0); // Get a double just smaller than 1
const auto mp = std::numeric_limits<double>::max_digits10;
cout << 15 << ": " << setprecision(15)
<< abs(d) << " " << modf(abs(d), &ip) << '\n';
cout << mp << ": " << setprecision(mp)
<< abs(d) << " " << modf(abs(d), &ip) << '\n';
}
关于coliru:http://coliru.stacked-crooked.com/a/e00ded79c1727299
15: 1 1
17: 0.99999999999999989 0.99999999999999989