在我的程序中,一些双变量采用1.00000001
形式的值。使用1
对这些变量进行等式检查显然会失败。
我想知道如何降低c中double类型变量的精度,以便与整数相等。
答案 0 :(得分:3)
您几乎不应该检查浮点值是否完全相等,特别是当它们来自计算时。您应该检查比较值小于某个epsilon的差异的绝对值。 double的“精度”由内部数字表示给出,您无法更改它。 如何准确地选择epsilon可能很困难,对于那个讨论的答案有一些评论,阅读它,但你最终会得到基于epsilon的实用平等。
答案 1 :(得分:2)
没有可移植的方式,没有。
使用GNU C库,您可以使用this API更改舍入模式。
但总的来说,最好用代码来表达它,这样你的期望就会变得清晰和便携:
#define EQUALITY_EPSILON 1e-3 /* Or whatever. */
if(fabs(x - y) <= EQUALITY_EPSILON)
{
}
答案 2 :(得分:1)
您应该避免在浮点比较中检查是否相等。相反,使用精度值epsilon
,如下所示:
if (fabs(a - b) < epsilon)
{
// treat a and b as equal
}
ε的选择可能很复杂,但我的知识并没有那么远。
Google搜索“每个程序员应该知道的关于浮点算术的内容”。这是一篇涵盖所有这些内容的知名文章。
答案 3 :(得分:0)
“降低双重型变量的精度”没有多大意义。您应该考虑使用ceil
,floor
和round
之类的函数,而不是以您可以很好地控制的方式从double中生成一个整数,然后使用该整数在你的比较中。
答案 4 :(得分:0)
在C99
#include <stdio.h>
#include <math.h>
int main(){
double d = 1.00000001;
int i = (int)round(d);
printf("%d\n", i);
return 0;
}