Еще до начала битвы проявился фактор, игравший на руку карфагенянам. Сильный южный ветер дул римлянам прямо в лицо, и тучи песка и пыли, поднятые пунийским войском, существенно затрудняли легионерам дыхание и снижали видимость (Liv. XXII, 46, 9). Поначалу, впрочем, это не играло существенной роли, и сражение легковооруженной пехоты прошло без особого перевеса какой-либо из сторон. Единственной значимой утратой римлян стало то, что тяжелое ранение вывело из строя консула Эмилия Павла – он пострадал от камня, метко брошенного балеарским пращником. Гораздо хуже обстояло дело на правом фланге римлян, прижатом к реке и не имевшем возможности маневрировать. Схватка здесь была особенно ожесточенной, поскольку сбившиеся в свалку всадники не могли рассредоточиться, напирали друг на друга, стаскивали противников с коней и продолжали бой уже пешими. Действовавшая здесь против римской кавалерии иберийская и кельтская конница стремительным натиском опрокинула вражеские порядки и обратила римлян в бегство.
Одновременно с этим разгорелся бой тяжеловооруженной пехоты, в ходе которого кельты и иберы под натиском превосходящих сил римлян вынуждены были постепенно отходить назад, увлекая за собой неприятельские отряды. Римские воины все больше углублялись в пунийские порядки, и выпуклая часть карфагенского построения вначале выпрямилась, а затем превратилась в вогнутую, постепенно охватывая римские силы полукольцом. Плотное построение римских легионов привело к тому, что по мере продвижения вперед их колонна все больше вытягивалась в длину и сужалась по фронту. Мало задействованные в сражении ливийские пехотинцы правого и левого флангов карфагенского построения вначале ударили по флангам римской пехоты, а затем зашли ей в тыл. Окружение завершили кельто-иберийская кавалерия, прошедшая вдоль реки, и нумидийские всадники, опрокинувшие конницу римских союзников. Наступление нумидийцев началось с военной хитрости, когда 500 всадников сделали вид, что сдаются в плен, а затем, выхватив спрятанные мечи, ударили по римлянам с тыла (Liv. XXII, 48, 1–4). Когда к нумидийцам присоединились галльские и иберийские всадники, судьба сражения была окончательно решена. Командовавший кельтской и иберийской конницей Гасдрубал приказал нумидийским всадникам преследовать бежавших с поля боя союзников римлян, а сам ударил в тыл римской пехоте.
Римляне, заняв круговую оборону, сражались на пределе сил, однако вырваться из окружения им не удавалось. Действуя на ограниченном пространстве, они были лишены возможности маневрировать, а сражаться могли лишь внешние шеренги. Воинам Ганнибала нередко даже не было нужды вступать в рукопашную схватку, ведь каждый брошенный дротик или выпущенный из пращи камень неминуемо поражали цель в плотных рядах противника. Вырваться удалось лишь нескольким небольшим отрядам, которые либо направились в малый и большой римские лагеря, либо рассеялись по окрестностям. Крупнейшая из всех собиравшихся ранее римская армия была уничтожена практически полностью. Согласно Полибию, потери римлян составили убитыми около 70 тыс. пехотинцев и более 5 600 всадников, пленными – 10 тысяч. Лишь 3 тыс. воинов смогли бежать с поля боя (Polyb. III, 117, 2–4). Евтропий приводит сведения о 60 тыс. убитых пехотинцев и 3,5 тыс. кавалеристов. Погибли, по его словам, также 350 сенаторов и знатных римских граждан, занимавших ранее высокие государственные посты (Eutrop. III, 10). Явно преуменьшенные данные о потерях приводят также Плутарх и Павел Орозий. В жизнеописании Фабия Максима биограф называет такие цифры: 50 тыс. убитых и 4 тыс. плененных римлян на поле боя, а также 10 тыс. захваченных в плен в большом и малом лагерях (Plut. Fab. 16). Орозий называет цифру в 44 тыс. убитых (Oros. IV, 16, 2). Данные Тита Ливия следующие: погибли 45,5 тыс. пехотинцев и 2 700 кавалеристов, пленены – 4 тыс. пехотинцев и 1500 всадников. Из высшего командного состава погибли консул Луций Эмилий Павел, бывший консул Гней Сервилий Гемин и бывший начальник конницы при диктаторе Квинте Фабии Максиме Марк Минуций Руф, а вместе с ними восемьдесят сенаторов и бывших консульских квесторов и эдилов, двадцать девять военных трибунов и два консульских квестора (Liv. XXII, 49, 15–18). Консул Гай Теренций Варрон вместе с 50 (или, согласно Полибию, 70) всадниками смог бежать в Венусию. Потери войска Ганнибала по сравнению с потерями римлян представляются совсем незначительными – по данным Полибия, карфагенский военачальник потерял 6 тыс., а по данным Тита Ливия – 8 тыс. воинов (Polyb. III, 117, 6; Liv. XXII, 52).