【问题标题】:Why does trunc(1) output as 0?为什么 trunc(1) 输出为 0?
【发布时间】:2012-08-05 09:03:51
【问题描述】:

谁能解释一下为什么在 c++ 中会发生这样的事情:

double tmp;
...                    // I do some operations with tmp 
                       // after which it has to be equal to one
cout << tmp;           // prints 1
cout << trunc(tmp);    // prints 0
cout << trunc(tmp*10); // prints 9

我用它来分隔数字的小数部分,例如,如果我有:5.010 ...我想有 0.010 ..所以我正在使用:

double remainder = tmp - trunc(tmp);

我正在发布整个代码......地板的建议不起作用

short getPrecision(double num, short maxPrecision) {

  // Retrieve only part right of decimal point
  double tmp  = fabs(num - trunc(num));
  double remainder = tmp;

  // Count number of decimal places
  int c = 0;
  while (remainder > 0 && c < maxPrecision) {
    tmp *= 10;
    remainder = tmp - trunc(tmp);
    c++;
  }
  return c;
}

当我使用 5.1 运行这个函数时,remanider 是 0 而不是 1

【问题讨论】:

  • 你能告诉我们操作吗?因为正如 Armen 的回答所指出的那样,有时双重操作并不准确。
  • 在输出值之前尝试将精度设置为 17。 &lt;&lt; 舍入(默认为 6 位精度)。截断和舍入给出不同的结果也就不足为奇了。
  • 或者您可以尝试输出 tmp - 1。在我看来,tmp 根本不必为 1。

标签: c++ double decimal-point truncation


【解决方案1】:

经过一些计算,它必须是一个?好吧,它也可以是0.99999999999999999。浮点运算并不精确,您应该始终考虑到这一点。

【讨论】:

  • 嗯,0.(9) 正好等于 1 btw ;P
  • @SingerOfTheFall:是的,但前提是有无数个 9。但是在计算机中,一切都是有限的:P
【解决方案2】:

请在http://en.cppreference.com/w/cpp/numeric/math/trunc查看图片。那里的图表解释了与truncing 1 的不一致。可能同样适用于 10

这应该可以帮助您实现所需:

double remainder = tmp - floor(tmp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多