One can go to higher precision and also (in this case) avoid NIntegrate
like so.
stdInt[df_, t_] =
Integrate[PDF[StudentTDistribution[df], x], {x, -t, t}, Assumptions -> t > 0 && df > 0]
(* Out[218]= (2 t Hypergeometric2F1[1/2, (1 + df)/2, 3/2, -(t^2/df)])/(Sqrt[df] Beta[df/2, 1/2]) *)
FindRoot[stdInt[300, t] == 95/100, {t, 1}, WorkingPrecision -> 20]
(* Out[227]= {t -> 1.9679030112610870301} *)
This seems to work just fine. However, if ever you need a better starting point for the root search, your approximation is a good way to get one.
normInt[t_] =
Integrate[PDF[NormalDistribution[0, 300/298], x], {x, -t, t}, Assumptions -> t > 0]
(* Out[228]= Erf[(149 t)/(150 Sqrt[2])] *)
FindRoot[normInt[t] == 95/100, {t, 1}, WorkingPrecision -> 20]
(* Out[230]= {t -> 1.9731181052416653378} *)
Unfortunately the higher precision is still necessary because FindRoot
will resort to the precision of its inputs if that's lower than the requested WorkingPrecision
. (I myself find this really annoying when it's due to a starting point, But we've yet to change that.)
Last is a method that works for this particular function. We take the log of the exact integral after function-expanding, and only evaluate for t
set to an explicit real value. This avoids some conversion of the hypergeometric to numerically unusable expressions (when using machine precision).
logstdInt[df_, t_] = FunctionExpand[Log[stdInt[df, t]], Assumptions -> {t > 0, df > 0}] /.
Log[aa_.*Gamma[xx__]^bb_.] :> Log[aa] + bb*LogGamma[xx]
(* Out[245]=
Log[2] - 1/2 Log[df \[Pi]] + Log[t] +
Log[Hypergeometric2F1[1/2, (1 + df)/2, 3/2, -(t^2/df)]] - LogGamma[df/2] + LogGamma[(1 + df)/2] *)
logstdIntNumeric[df_?NumberQ, t_Real] := logstdInt[df, t]
FindRoot[logstdIntNumeric[300, t] == Log[.95], {t, 1}]
(* Out[249]= {t -> 1.9679} *)