Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R得到非常小的数字而不是零_R_Arithmetic Expressions - Fatal编程技术网

R得到非常小的数字而不是零

R得到非常小的数字而不是零,r,arithmetic-expressions,R,Arithmetic Expressions,在下面的代码中,如果TrimCY=TrimBYS,快照应为0 df <- df %>% mutate(snapshot = case_when(Trend_direction != 2 ~ (TrimCY-TrimBYS)*sign(Trend_direction)*10/abs(Target_Snap-TrimBYS), TRUE ~ 10-((abs(TrimCY-Target_Snap)*10)/abs(T

在下面的代码中,如果TrimCY=TrimBYS,快照应为0

df <- df %>% 
   mutate(snapshot = case_when(Trend_direction != 2 ~ (TrimCY-TrimBYS)*sign(Trend_direction)*10/abs(Target_Snap-TrimBYS), 
                               TRUE ~ 10-((abs(TrimCY-Target_Snap)*10)/abs(Target_Snap-TrimBYS))))

有人知道我为什么会得到这些非常小的非零结果吗?当我将算术函数复制到控制台并使用上面的值执行时,结果总是为0。

这些都是浮点错误。要了解发生了什么,请在一张纸上计算出
1-1/3-1/3-1/3=?
,但只计算小数点后3位。这个方程看起来像
1-0.333-0.333-0.333=0.001
。即使它应该是零,它不是。计算机基本上是这样做的,但小数位数和二进制数要多得多

关于更详细的解释,有很多参考资料:例如:

你可以把答案四舍五入,或者(正如阿克伦建议的那样)设置你的选项,使这些数字显示为零


这就是为什么当x进行了这些类型的浮点计算时,最好不要测试
x==0
,而总是做类似于
abs(x)<1e-10
的事情。

这是精度。您可以设置
选项(scipen=999)
非常感谢您的全面和有用的回复。我尝试了
选项(scipen=999)
但数字仍然不显示为零。我会试着四舍五入。
Trend_direction   Target_Snap   TrimCY   TrimBYS   snapshot 
1                 56            53       53        0.000000e+00 
1                 56            54       54        -3.552714e-14    
1                 56            55       55        -7.105427e-14