The left-handed opener hit one six and 13 fours in his third hundred as Bangladesh surpassed Zimbabwe's modest total of 184-9 with 27 balls to spare for a 1-0 lead in the five-match series on Thursday.
Nafees, 20, built on a superb effort from left-arm spinner Abdur Razzak, who grabbed a career-best haul of 4-33 to play a key role in restricting Zimbabwe after the tourists had elected to bat.
Only four Bangladeshis have scored a century in one-day internationals, but Nafees is the only batsman to make more than one. He also completed 1,000 runs during his 138-ball knock.
Nafees, who hammered an unbeaten century in his previous one-dayer against the same opponents in a Champions Trophy match in India last month, continued to feast on Zimbabwe's bowling with his rich strokeplay.
He dominated a 72-run stand for the opening wicket with Mehrab Hossain (13) and then put on 114 for the unfinished second wicket with Aftab Ahmed (60 not out), who also completed 1,000 runs.
Razzak was earlier well supported by left-arm spinners Mohammad Rafique and Saqibul Hasan, who took two wickets apiece as the tourists lost their way after making a sound start.
Zimbabwe put on 52 for the opening wicket through Brendan Taylor (38) and Stuart Matsikenyeri (27), but then found runs hard to come by against the spin trio.
Razzak bagged four wickets off 10 tight overs, his best in 26 one-day internationals. Saqibul took 2-30 and Rafique 2-35.
Elton Chigumbura (31), Mluleki Nkala (22) and Gray Brent (20) were the other main scorers, but all of them failed to play a long knock after settling down.
Zimbabwe 184 for 9 (B Taylor 38, Matsikenyeri 27, Chigumbura 31, Nkala 22; Razzak 4 for 33, Saqibul 2 for 30, M Rafique 2 for 35) lost to Bangladesh 186 for 1 (Shahriar Nafees 105 n o, Aftab Ahmed 60 n o)