【问题标题】:How to truncate a floating point number after a certain number of decimal places (no rounding)?如何在一定数量的小数位后截断浮点数(无舍入)?
【发布时间】:2012-10-05 02:59:36
【问题描述】:

我正在尝试以 2 点精度打印数字 684.545007,因为在 684.54 之后数字被截断(不四舍五入)

当我使用时

var = 684.545007;
printf("%.2f\n",var);

它输出684.55,但我想得到的是684.54

有谁知道我该如何纠正这个问题?

【问题讨论】:

  • 如果您期待的是684.54,那么您期待的是错误的结果。就这么简单。
  • 因为我不想要一个四舍五入的值。此代码是 Programming Online Judge 代码解决方案的一部分。
  • 再次:舍入不像您显然想要的那样工作。 Select isn't broken.
  • @JackManey,当然不是。号码是 684.545 而不是 684.555。输出应该是 .54 而不是 .55
  • 您似乎对“精度”的含义有错误的理解。

标签: c++ c printf


【解决方案1】:

您正在寻找的是截断。这应该有效(至少对于不是很大的数字):

printf(".2f", ((int)(100 * var)) / 100.0);

转换为整数会截断小数部分。

在 C++11 或 C99 中,您可以为此目的使用专用函数 trunc(来自标头 <cmath><math.h>。这将避免对适合整数类型的值的限制。

std::trunc(100 * var) / 100     // no need for casts

【讨论】:

  • 如果您有 C99 标准库,那么您可以使用 trunc(),它适用于更大范围的数字。
  • @caf:谢谢,我补充了。我想知道是否有人会建议lrint() 作为第一个解决方案。
【解决方案2】:

这是我的方法。它看起来很丑,但在大多数情况下确实有效,例如var 可以大于 int,可以为零或奇异的“-0”。但它不处理无穷大和 NaN。

double var = 684.545007; // or whatever
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.;
printf ("%g\n", var_trunc);

【讨论】:

    【解决方案3】:
    printf("%.2f\n", var - 0.005);
    

    【讨论】:

    • 由于 .005 不能精确表示,这势必会为一些值产生错误的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2011-05-10
    相关资源
    最近更新 更多