Here are a few ways to resolve this. The issue is that an edge creates an independent path. As originally pointed out by Paul Gaborit, one may use the keys tip=proper or tips=on proper draw, which are described in pgfmanual v3.1.4b on p. 188. IMHO the cleaner solution is to pass the arrow heads to the edge. The arguably cleanest way is to replace edge by to, which avoids drawing two separate paths. There are further option such as using \path instead of draw, but IMHO this defeats the purpose because the path is still there and may (at least in principle) alter the bounding box, say.
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[auto,font=\sffamily]
\begin{scope}[local bounding box=original]
\draw[<->] (0,0) edge node {$a$} (1,0);
\end{scope}
\node[above] at (original.north) {original situation};
%
\begin{scope}[xshift=4cm,local bounding box=proper,tips=proper]
\draw[<->] (0,0) edge node {$a$} (1,0);
\end{scope}
\node[above] at (proper.north) {\texttt{tips=proper}};
%
\begin{scope}[yshift=-2cm,local bounding box=on proper draw,tips=on proper draw]
\draw[<->] (0,0) edge node {$a$} (1,0);
\end{scope}
\node[above] at (on proper draw.north) {\texttt{tips=on proper draw}};
%
\begin{scope}[yshift=-2cm,xshift=4cm,local bounding box=clean]
\draw (0,0) edge[<->] node {$a$} (1,0);
\end{scope}
\node[above] at (clean.north) {cleaner(?) solution};
%
\begin{scope}[yshift=-4cm,local bounding box=to]
\draw[<->] (0,0) to node {$a$} (1,0);
\end{scope}
\node[above] at (to.north) {\texttt{to} instead of \texttt{edge}};
%
\begin{scope}[yshift=-4cm,xshift=4cm,local bounding box=path]
\path[<->] (0,0) edge node {$a$} (1,0);
\end{scope}
\node[above] at (path.north) {\texttt{\textbackslash path} instead of
\texttt{\textbackslash draw}};
\end{tikzpicture}
\end{document}

tips=properworks. What's the idea here? – LarrySnyder610 Sep 28 '19 at 01:00