Sri Lanka opted to bowl on a pitch unused for a long time, but Hamilton Masakadza's shots early on pointed to a good pitch in the offing.
Nuwan Pradeep struck the opening blow in the eighth over, with Solomon Mire's wicket.
Tarisai Musakanda was sent ahead of Craig Ervine, and proved to be one half of the crucial century stand for the second wicket.
Hamilton Masakadza then brought up his fifth ODI century off just 83 balls to end a barren run.
Gunaratne took out a well-set Sean Williams on 43 in the 45th over as Zimbabwe lost steam thereafter.
Lasith Malinga took out Malcolm Waller soon after, but Peter Moor's pinch-hitting helped Zimbabwe reach 310-8 in 50 overs.
Danushka Gunathilaka and Niroshan Dikwella hit their maiden ODI tons in a 229-run opening stand that helped Sri Lanka to their highest ODI chase at home.