To answer your first question, you can use the Marker Values[ ] property of a scale (X or Y) to change the location of one of the tick marks (and its label). In your case, you would want to read the current values, then replace anything in the array below a certain value (e.g. 1.23543a) with a zero. Set Uniform Marker Spacing? to FALSE, then write the values back to the graph. This actually moves the marker, itself, so should give you what you want. As you mentioned, the root cause of this problem is finite precision in the arithmetic. There is not a good generic solution.
I don't have an answer to putting a space between SI units and the text.