【问题标题】:How to check if float is a whole number?如何检查浮点数是否为整数?
【发布时间】:2013-02-25 04:00:29
【问题描述】:

printf 函数有某种函数,您可以在其中使用 %g,如果浮点数为 3.00,它将显示整数 3,如果它实际上是浮点数,将显示 3.01,有没有你可以通过一些代码来做到这一点吗?

【问题讨论】:

  • 我认为 %g 是什么,我不确定你问了什么
  • 能否请您重述问题?我不明白你在问什么。
  • %g 的函数,然后在实际函数中,所以我可以在 printf 之外使用它。

标签: c++ numbers integer comma


【解决方案1】:

没有一个简单的答案

整数值确实具有浮点和双精度格式的精确表示。所以,如果它真的已经是不可或缺的,你可以使用:

f == floor(f)

但是,如果您的值是计算的结果,该计算在某一时刻涉及任何类型的非零小数部分,那么您将需要担心您可能有一些非常接近整数但不是真的,确切地说,到最后一点是一样的。您可能希望将其视为不可分割的。

可以做到这一点的一种方法:

fabs(f - round(f)) < 0.000001

当我们谈到这个主题时,对于纯粹主义者,我们应该注意int i = f;double i = f; 将根据 FPU 模式进行舍入,而 round(3) 将舍入中途的情况,远离零。

【讨论】:

  • 谢谢,这看起来很有用。
  • @user2140285 - 小心。 “几乎相等”是一种先进的技术。它违反了传递性(a 几乎等于 b,b 几乎等于 c 并不意味着 a 几乎等于 c)并且它可以掩盖以后会困扰您的实际问题。
  • 您可能会发现常量FLT_EPSILONDBL_EPSILONLDBL_EPSILON(在&lt;cmath&gt; 中定义)便于在使用此技术时进行比较
  • Pete Becker 和 fish2000 的好建议。这是一项先进的技术。 (以及为什么我说:这里没有简单的答案。)
  • “整数值确实具有浮点和双精度格式的精确表示” - 也许这个文本需要一些更正(只是为了改进)。在使用通用模型 ISO/IEE 754-1985 的真实计算机中,double 和 float 使用有限位数的尾数。只需查看 FLT_MANT_DIG(24) 和 DBL_MANT_DIG(53)。所以可以说,如果你有 24 位整数或 53 位整数,那么表示是一样的。
猜你喜欢
  • 2011-08-13
  • 2023-03-14
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多