The deal announced Thursday includes a $500,000 signing bonus, a $3 million salary and $500,000 in performance bonuses: $100,000 each for 250, 300, 350, 400 and 450 plate appearances. A first baseman, the 30-year-old Carter is likely to see time at designated hitter.
Carter's career-high 41 home runs last season matched Colorado's Nolan Arenado for tops in the NL. He became a free agent in December when Milwaukee failed to offer a 2017 contract.
Carter hit .222 with a career-best 94 RBI while appearing in a NL-leading 160 games last season.