你能将浮点值精确地与零进行比较吗?

2022-09-01 20:10:31

我知道我们不能使用==比较2个浮点值。我们只能比较它们在彼此的某个区间内。我知道

if(val == 0.512)

由于浮点计算和转换为二进制时固有的错误而错误,并且应该是

if (val in (0.512-epsilon, 0.512+epsilon))

但是0特别吗?我们可以将浮点数精确地与0进行比较吗?或者甚至这是不正确的?特别是在C#和Java的上下文中?

double val = 0;
val = getVal();
if(val == 0)

答案 1

即使 0 具有精确的表示形式,也不能依赖使用浮点数的计算结果正好为 0。如您所见,这是由于浮点计算和转换问题。

因此,您应该针对公差 epsilon 测试 0。


答案 2

如果为该变量赋值零,则可以与零进行比较。如果你从例如得到零。减法你仍然可以得到一个非常小的数字接近零。例如:0.1-0.1可以评估为1e-9。