Faits: A. X._ exploite une entreprise individuelle de travaux de second oeuvre dans le bâtiment, sous le nom de A._. Dans le cadre des travaux de rénovation de l'hôtel B._, à ..., il a confié à Y._ SA, en sous-traitance, des travaux de carrelage dans les salles de bains. Le 27 août 2003, Y._ SA a adressé à A._ un devis d'un montant total de 191'686 fr.70 TTC, soit 178'147 fr.50 HT correspondant à un prix unitaire de 2'375 fr. pour 75 salles de bains. X._ a corrigé à la main deux prix unitaires figurant sur ce devis, ramenant le poste "pose de carrelage et joint + les faïences" de 48 fr. à 43 fr. et celui "F. P. silicone" de 16 fr. à 14 fr.; il a également inscrit un rabais de 5% et un escompte de 3%. Par courrier du 21 septembre 2003, Y._ SA a remis à A._ un avis de situation, réclamant le paiement de 76'674 fr. correspondant à 40% du devis du 27 août 2003. X._ a considéré que Y._ SA avait surestimé les travaux exécutés; en conséquence, il a payé un acompte de 55'779 fr.84 seulement. Le 25 novembre 2003, Y._ SA a adressé à A._ une facture finale d'un montant de 172'993 fr.90 TTC, portant sur les travaux effectués dans 70 salles de bains. Par lettre du 8 décembre 2003, X._ a indiqué à Y._ SA que la société propriétaire de l'hôtel mettait en cause la qualité du travail exécuté dans certaines salles de bains; un délai au 19 décembre 2003 était imparti à l'entrepreneur pour remédier à cette situation. Par ailleurs, X._ relevait que le nombre de chambres, les surfaces et les prix unitaires figurant dans la facture finale ne correspondaient pas au devis du 27 août 2003; il invitait Y._ SA à prendre contact avec lui afin de clarifier la situation. Cette démarche est demeurée vaine. Par courrier du 12 mars 2004, X._ a transmis à Y._ SA un décompte établi par lui-même. Selon ce document, il reconnaissait devoir à l'entreprise la somme de 45'392 fr.56 TTC; d'un total brut de 118'856 fr.08 HT, il convenait de déduire les montants de 16'653 fr.48 (retouches exécutées par A._ et réparation des malfaçons), 8'171 fr.21 (rabais d'adjudication de 8%) et 55'779 fr.84 (acompte déjà versé). Le 10 mai 2004, Y._ SA a adressé à A._ une nouvelle facture, d'un montant total de 138'128 fr.55 HT. Par rapport à la facture du 25 novembre 2003, le poste "coupe de faïences autour de portes et fenêtres" par 7'700 fr. était supprimé; les surfaces et mètres linéaires étaient réduits, tout en restant plus importants que ceux résultant du décompte de X._; enfin, étaient déduits de la facture les montants de 2'275 fr. (retouches effectuées par A._), 680 fr. (benne pour évacuation) et 3'000 fr. (en raison de malfaçons dans la pose des carrelages). X._ a refusé de payer cette facture, qu'il a retournée à Y._ SA. Le 9 octobre 2008, Y._ SA a cédé à Y._ Sàrl une créance de 102'826 fr.51 envers X._. Le 16 décembre 2008, Y._ Sàrl a fait notifier à X._ un commandement de payer le montant de 102'826 fr.50. Le poursuivi a formé opposition. B. Par acte déposé le 21 octobre 2009, Y._ Sàrl a assigné X._ en paiement de 102'826 fr.51, plus intérêts à 5% dès le 10 juin 2004; elle concluait également au prononcé de la mainlevée définitive de l'opposition. X._ a reconnu devoir à Y._ Sàrl uniquement la somme de 45'392 fr.56, plus intérêts à 5% dès la date moyenne du 1er janvier 2004. Il a déposé une demande reconventionnelle tendant à ce qu'il soit dit et constaté que Y._ Sàrl lui devait un montant de 45'000 fr. avec intérêts à 5% dès la date moyenne du 1er janvier 2004, que les montants de 45'392 fr.56 et 45'000 fr. étaient compensés et qu'il devait à Y._ Sàrl le montant de 392 fr.56, qu'il avait payé par chèque du 8 mars 2010. Par jugement du 7 septembre 2011, le Tribunal de première instance du canton de Genève a, sur demande principale, condamné X._ à verser à Y._ Sàrl la somme de 81'936 fr.15 avec intérêts à 5% dès le 10 mai 2004 et prononcé la mainlevée définitive de l'opposition. Il a rejeté la demande reconventionnelle. Statuant le 27 avril 2012 sur appel de X._, la Chambre civile de la Cour de justice du canton de Genève a admis partiellement le recours et annulé le dispositif du jugement de première instance en tant qu'il concernait la demande principale; elle a ensuite condamné X._ à verser à Y._ Sàrl la somme de 61'134 fr.20 avec intérêts à 5% dès le 10 juin 2004 et prononcé la mainlevée définitive de l'opposition à hauteur de cette somme. C. X._ interjette un recours en matière civile. Tant sur la demande principale que sur la demande reconventionnelle, il reprend les conclusions qu'il a formulées devant les instances cantonales. A titre subsidiaire, il demande le renvoi de la cause à la Cour de justice pour nouvelle décision dans le sens des considérants du Tribunal fédéral. Dans sa réponse, Y._ Sàrl propose le rejet du recours. Pour sa part, la Cour de justice se réfère aux considérants de son arrêt.