Dropped in the covers on nought, Nafees shared partnerships of 84 runs with Saqibul Hasan (37) and 80 with skipper Habibul Bashar (30).
Brendan Taylor hit a patient 52 but two run-outs and tight spin bowling saw Zimbabwe bundled out for 130.
This match was of academic interest as neither team were able to qualify for the main tournament after both lost to Sri Lanka and West Indies.
Bangladesh gave Mehrab Hossain a debut and recalled Rajin Saleh, with Mohammad Ashraful and Syed Rasel sitting out.
The Zimbabweans had permission to field all-rounder Gary Brent as a replacement for Terry Duffin who was unwell.
Looking to atone for a 3-2 series defeat in Zimbabwe in August, Bangladesh made a nervous start, losing Rajin Saleh who was trapped in front in the fifth over after making no contact playing across the line.
Aftab Ahmed soon joined him in the pavilion when he gloved a leg-side delivery and was superbly latched up by gloveman Taylor, leaving Bangladesh 26-2 in the 10th over.
Nafees and Saqibul paced up the innings slowly, bringing up the 100 in the 27.3 overs, with the opener reaching 50 from 92 balls shortly afterwards.
Saqibul departed when he failed to get on top of a cut and was well caught diving forward to his left by Ed Rainsford.
Nafees continued and helped Bangla reach 150 by sweeping the first ball of the 39th over for four, then backed away to carve the next ball from Prosper Utseya over cover for four more.
He continued the assault in the Zimbabwe skipper's next over, moving into the 90s by stepping down the pitch and sweeping for six, eventually reaching three figures from 143 deliveries.
Wickets tumbled in the search for quick runs, Bashar deceived by Rainsford, Farhad Reza mis-timing to extra-cover and Mashrafe Mortaza holing out to long-on off Brent.
Nafees remained unbeaten on 123, only the second Bangla batsman to carry his bat in a ODI innings, after Javed Omar who achieved the feat twice but failed to make a century.
Zimbabwe also lost an early wicket in their innings, Chamu Chibhabha was trapped plumb infront playing across the line to Mortaza.
Masakadza did not last long, however, not watching Taylor as his partner set off for a run, resulted in both batsmen stranded at one end.
The 50 arrived after Taylor struck three fours on on-side in the 13th over. However there was one more rrun out of comedy of error type. Taylor clipped behind square but Stuart Matsikenyeri did not see his partner coming for the second run until he was beside him at the striker's end.
Having taken 69 balls to reach his 10th ODI fifty, Taylor was the fifth man out when he overbalanced pushing forward defensively and was stumped.
The Zimbabweans stuttered to 100 in the 32nd over but the remainder of the innings was academic as the slow bowlers took hold.