"Is there a way to account for possible error in the speeds of the motors so that the robot can end up in a very precise location?"
The other answers describe the approximate solution (encoders). It depends on what you define 'precise' as. For an Arduino budget project, it is probably precise enough. But typically, say you direct your Arduino robot to move in a 1 meter square, you can expect it to be off by several cm when it returns to the start point. That is usually fine for an Arduino robot, but imagine something 100 times bigger (a car) being off by 100 times as much, now you have problems.
This problem is overcome by adding additional sensors. Each one can add additional accuracy until required precision is reached.
A gyro helps by giving more accurate short term turning information, as encoders depends on mechanical solutions that have slippage.
A compass works by giving more long term heading information, but is subject to disturbances.
A GPS, if available, can provide periodic 'corrections' to overall location information.
A SLAM algorithm, often laser range finder based, can triangulate on detected objects to help improve accuracy.
Lately the use of images, especially stereo, can also provide triangulation information. This is often referred to as optical odometry.
All of these additional measurements, separate or in some combination, is 'fused'. Very often with some form of a Kalman filter. The filter helps prioritize which signals to use dynamically.