Mashrafe Mortaza’s side finished with 268 runs against a target of 266 in 47.2 overs, at a loss of five wickets.
Earlier, Mossadek Hossain marked his return to the Bangladesh side by taking three wickets as New Zealand slumped to a total of 265 for eight in a must-win clash.
New Zealand were well set while captain Kane Williamson (57) and Ross Taylor (63) were sharing a stand of 83 — their third fifty partnership in as many matches this tournament.
But, as happened in their no-result washout with Australia and defeat by England, the Blackcaps’ innings collapsed once the experienced batsmen were out in quick succession.
Mossadek, chosen ahead of fellow off-spinner Mehedi Hasan, took two wickets in three balls on his way to impressive figures of three for 13 in three overs.
Fast bowler Taskin Ahmed, Bangladesh’s other change to a side that escaped with a no result against Australia, took two for 43 in eight overs.
New Zealand, who had been 152 for three off 30 overs, only managed 113 more runs in the last 20 overs. Given 300 is now generally regarded as a ‘par score’, Bangladesh were on top at the half-way stage — especially as Williamson had won the toss.
Both Bangladesh and New Zealand had to win this Group A match to stand a chance of going through to the semi-finals, although a victory for Australia against England at Edgbaston on Saturday would see them join the already-qualified tournament hosts in the last four.
New Zealand opener Martin Guptill was in excellent touch after the match started an hour late due to rain and drove Bangladesh captain Mashrafe Mortaza for six.
But Bangladesh’s change bowlers removed both Luke Ronchi and fellow opener Guptill to leave New Zealand 69 for two.
The extra pace of Taskin, recalled instead of batsman Imrul Kayes, appeared to surprise Luke Ronchi (16), a mistimed pull lobbing gently to Mustafizur Rahman at mid-on.
Guptill’s 33 then came to an end when he was lbw to Rubel Hossain.
Williamson, fresh from scores of 100 and 87 against England and Australia, showed his class with several elegant fours.
Taylor too drove Taskin down the ground before sweeping spinner Shakib Al Hasan for four.
Williamson went on to complete a 58-ball fifty, but he ran himself out as Bangladesh were rewarded for building pressure.
Taylor turned Shakib straight to Mossadek at short fine leg and non-striker Williamson set off for a single that was never on. With Taylor not moving, Williamson turned but was run out as Shakib tidied up a wayward throw from Mossadek.
New Zealand needed Taylor to ‘go on’ to a big score but Taskin, spotting the batsman was trying to ramp him, adjusted his length and an 82-ball innings ended with a simple catch to short fine leg.
Mossadek then removed New Zealand’s next three batsmen, striking twice in the 44th over when Neil Broom (36) sliced to backward point and Corey Anderson was plumb lbw for a duck.
The spinner completed his haul by having Jimmy Neesham (23), yards down the pitch, stumped by Mushfiqur Rahim.
Bangladesh: Tamim Iqbal, Soumya Sarkar, Sabbir Rahman, Mushfiqur Rahim (wkt), Shakib Al Hasan, Mahmudullah, Mosaddek Hossain, Mashrafe Mortaza (capt), Taskin Ahmed, Rubel Hossain, Mustafizur Rahman
New Zealand: Luke Ronchi (wkt), Martin Guptill, Kane Williamson (capt), Ross Taylor, Neil Broom, Jimmy Neesham, Corey Anderson, Mitchell Santner, Adam Milne, Tim Southee, Trent Boult