I downvote (rarely) in 2 cases:
- obviously bogus code or bad advice: posts are here to stay, and I think the downvotes help teach people that they should really know what they are talking about when they publish code, and that they should test it before posting. BTW that's also why my favorite code style is a complete script with the DATA part holding test data: this allows readers to download and test the code, and to add more tests if they want to. If there is no further post correcting the mistake then I post a correction, otherwise I believe the -- is enough.
- trolls, or really bad meditation, especially deliberatelly provocative ones. Some monks make a habit of posting before they have really thought about a problem, I think it is worth --'ing them in an (often futile) attempt at making them realize that just like you should think before writing code, you should think before posting.
I think a lot of newcomers start by posting a lot, often bad quality posts, in order to gain XP. The downvotes help teaching them the proper behaviour, which is to post accurate code and well-thought out meditations. Posting should not translate into automatic XPs.