【问题标题】:How to compare a float using greater than and less than (> and <) in C [duplicate]如何在C中使用大于和小于(>和<)比较浮点数[重复]
【发布时间】:2020-04-22 15:28:48
【问题描述】:

january13.overtime_hours 的值为0.000000(它是一个浮点数)

谁能解释一下为什么下面的代码仍然执行 if 语句中的代码?但是,如果我尝试使用 == 而不是 ">" 它不会执行。

printf("%f", january13.overtime_hours);
if (january13.overtime_hours > 0.0)
{
  overtime_paycheck = ( january13.overtime_rate * 
  january13.overtime_hours);

  printf("Overtime Pay: %.2f\n", overtime_paycheck);
}

【问题讨论】:

  • 因为是0.000000000001,但是打印的时候只打印小数点后六位。要查看真实数字,请尝试printf("%.50f", january13.overtime_hours);
  • 你真的不想为此使用浮点数。浮点数不适用于某些细粒度的东西,例如“小时的分数不是纳秒”或“货币单位的分数不是无穷小”
  • 如果您按分钟或季度处理加班时间,只需使用整数分钟和美分/美分作为费率。
  • screaminghard,要调试浮点问题,请使用"%e""%g""%a",而不是"%f" 来查看有效数字。

标签: c floating-point comparison operators


【解决方案1】:

了解DBL_EPSILON/FLT_EPSILON,这些是来自cfloat的宏。

那么这些是什么?

float、double 和 long double 分别与 1.0 和下一个可表示值之间的差异

要将它们与==比较,你必须写fabs(a-b)&lt;=FLT_EPSILON,它比较两个数字ab是否相等,如果这个语句返回true,那么它们之间没有区别他们实际上。

根据您的需要使用功能,ref

float       fabsf( float arg );
double      fabs( double arg );
long double fabsl( long double arg ); // Defined in header <tgmath.h>

【讨论】:

  • fabs(a-b)&lt;=FLT_EPSILONfabs(a-b)==0.0 相同,当a,b 是大值(和相邻的double)时,如1e30 和相同的true(根本没有测试)@ 987654337@ 的数量级很小。它将浮点数从 浮点 中取出。这是比较浮点数的非常错误的方法。另外:对于float 的绝对值,使用fabsf() 比使用fabs() 更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2011-04-19
  • 2015-09-06
相关资源
最近更新 更多