Put into bat by the hosts, Bangladesh rallied late in their innings to post 252 for nine wickets, a par score on a good batting track. Despite some jitters along the way, Zimbabwe chased down the runs with 13 balls to spare.
Zimbabwe were outclassed in the series opener at the same venue on Friday when they were thumped by 121 runs, but showed much more mettle in the second match.
Williams came in with his side teetering at 94 for three, but worked the ball around the ground expertly, hitting six fours and a six in his 75-ball knock.
He got support from Malcolm Waller (39 not out) as the pair put on 86 for the fifth wicket to see their side through to the win.
"I wanted to bat through the innings, it is a great batting track so you want to pad up and bat on this. The guys have put in a lot of work in the last few days and it has paid off," man of the match Williams said in a television interview after the game.
Zimbabwe captain Brendan Taylor played his part with a steady 37, while opener Vusi Sibanda struck 49.
"We showed a lot of character to bounce back from Friday," Taylor said.
"Sean Williams was fantastic along with Malcolm Waller. For 45 overs of their innings we were excellent with the ball and then let it slip at the end."
Bangladesh slumped to 124 for five in their innings before a swashbuckling unbeaten 53 off 22 balls from No 9 Abdur Razzak helped the side to 252.
Razzak smashed four fours and five sixes in his first ODI half-century.
"We didn't bat well, a couple of guys got going and did (not) go through," Bangladesh captain Mushfiqur Rahim said.
"At one stage we were looking at 180 all out, so we were happy with our total. But we needed early wickets and those did not come."