这是以前讨论过的常见问题,并且很好地解释了HERE
然而,我发现的所有答案都解释了处理平等的不同方法,但我不认为它们中的任何一个在代码中特别好或可读,最重要的是不能用于其他运营商as<,>,< =,> =或! (不)。
我的优先方法是使用舍入,但仅用于下面的比较。
> options(digits = 20)
> x <- cbind(c(1:10)/100*9,c(1:10)/10,c(1:10)/100)
> x
[,1] [,2] [,3]
[1,] 0.089999999999999997 0.10000000000000001 0.010000000000000000
[2,] 0.179999999999999993 0.20000000000000001 0.020000000000000000
[3,] 0.270000000000000018 0.29999999999999999 0.029999999999999999
[4,] 0.359999999999999987 0.40000000000000002 0.040000000000000001
[5,] 0.450000000000000011 0.50000000000000000 0.050000000000000003
[6,] 0.540000000000000036 0.59999999999999998 0.059999999999999998
[7,] 0.630000000000000115 0.69999999999999996 0.070000000000000007
[8,] 0.719999999999999973 0.80000000000000004 0.080000000000000002
[9,] 0.809999999999999942 0.90000000000000002 0.089999999999999997
[10,] 0.900000000000000022 1.00000000000000000 0.100000000000000006
> x[,1]==x[,2]-x[,3]
[1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE TRUE
> round(x[,1],15)==round(x[,2]-x[,3],15)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> round(x[,1],15)<=round(x[,2]-x[,3],15)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
舍入精确限制可以获得良好的结果,并且可以与其他操作员一起工作,对我来说似乎比其他函数更容易阅读,但我认为有时候它仍然会导致它自己的错误。
是否有最佳实践方法来处理这种紧凑且易于阅读的错误,并且可以与多个操作员一起使用?
甚至更好,是否有可能拥有一组替代运算符,例如~==
或~<=
,它们会自动舍入精确限制,以便我不需要经常考虑它们?
修改 为了更好地解释我为什么问这个问题,这不仅仅是处理平等问题。已经回答了。
但是,从第3行0.270000000000000018 > .27
和0.29999999999999999 > .3
以及0.029999999999999999 < .03
中的示例开始。但总和是0.30000000000000004
而不是0.29999999999999999
所以这些情况是&lt;和&gt;也将破裂,因为价值可以任意变为&lt;或&gt;。
在这种情况下,我会添加或减去一个小值.27 + .02 < .3 +.000001
,但这个值总是会根据具体情况而变化,甚至会根据使用情况而变化。
我正在处理我正在进行比较的数据,并且我经常看到与&lt;和&gt;我不得不经常进行代码调整来处理它。我想要一些东西,以便我不需要添加太多额外的代码来处理这个问题。