Your first problem is that you do not want the floor to be exerting a literal force on the character. If you are using the term 'force' in its true sense, that means that it will change velocity over time, which is not what you want when your character hits the ground (or when any collision occurs, for that matter). What you are actually looking for is an impulse, or an immediate change in velocity.
For reference, I recommend some articles written by Chris Hecker.
Your proposed fix of setting the y-velocity to 0 and adjusting the position above the ground is certainly a valid solution, since that would be an implementation of an impulse. For the general case (referring to Hecker's articles) you would multiply by the coefficient of restitution to calculate the new y-velocity. The problems you are describing indicate that there might be something else wrong with your code.
The other problem you might be facing is the contact problem: when one body is only contacting another, and not actually colliding or intersecting with it. The biggest problems arise when stacking objects on top of each other. This is actually difficult to solve, but alternate timestep schemes such as the one proposed in this paper open the door for solutions. I'm afraid I may be going on the scope of the question though so I'll stop there...
To sum up, I think you have the correct fix, and there is another bug in your code. It could be the order in which you carry out the collision response operations.