fmod告诉我1的小数部分是1

时间:2014-10-01 13:02:53

标签: c++ integer std rounding fmodf

我试图检查double变量p是否大约等于整数。在我的代码的某些时候我有

double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;

对于给定的跑步,我得到打印输出

1 1

这似乎可以说1的小数部分是1,我在这里遗漏了什么或者是否会有一些舍入问题等?

注意:我不包括整个代码,因为p的来源很复杂,我只是在问这是否是一个熟悉的问题

2 个答案:

答案 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