В интернете (да и в справочниках) часто публикуются приближённые формулы pH=-lg(C) для "сильных" кислот и pH=-(lg(Kd1)+lg(C))/2 для "слабых". Эти формулы обычно дают большую погрешность. К тому же, в малых концентрациях эти формулы начинают давать абсурдные результаты (pH>7), поскольку в них не учитываются протоны воды. А формулы типа pH=-lg(2C) для "двухосновных сильных кислот" вообще грубейшая ошибка, ибо многоосновные кислоты бывают "сильными" только по первому протону.
Точное вычисление pH основывается на решении уравнения диссоциации. Поскольку для многоосновных кислот суммарное уравнение получается высокого порядка, в данном калькуляторе применятся последовательное вычисление с суммированием (дающее довольно скромную погрешность в доли процента), затем высчитываются протоны воды и применяется несколько уточняющих итераций, в которых концентрация протонов пересчитывается, исходя из определённой на предыдущей итерации.
Для сравнения, во втором столбце серым шрифтом отображается вывод упомянутых выше грубых формул.
В коде вычисления выглядят вот так:
{
	K=[константы];
	Hs=0;
	Hi=C;
	for (i=0; i<3; i++){
		K=K[i]; KH=K+Hs;
		Hi=(-KH+Math.sqrt(KH*KH+4*K*Hi))/2;
		Hs+=Hi;
	}
	H=(Hs+Math.sqrt(Hs*Hs+4e-14))/2;
	for (k=0; k<5; k++) {
		Hs=0;
		Hi=C;
		for (i=0; i<3; i++){
			K=K[i];
			Hi=K*Hi/(K+H);
			Hs+=Hi;
		}
		H=(Hs+Math.sqrt(Hs*Hs+4e-14))/2;
	}
	return -Math.log(H)/Math.log(10);
}