Ну, вы просто не можете, максимальный размер Int32 2 147 483 648
и ваш результат умножения будет 2 500 000 000 , что больше и приведет к исключению, которое вы получили
Простой трюк, который вы можете сделать, это заставить один из аргументов быть не-int32 числом
вроде так
string calculation = "500000*5000.0";
var anwser = dt.Compute(calculation, "");
это приведет
+2500000000,0
Редактировать: (как сказал @PaulF)
DataSet попытается проанализировать литералы самостоятельно в порядке возрастания (int32-> int64-> double) и не сам результат.
это означает, что если один из литералов имеет значение int64 (в случае 5000000000 * 5000000 ), то результат может быть проанализирован как Int64 , но в первом случае 50000 * 500000 оба литерала Int32 и поэтому результат будет обработан как таковой
длинная версия От MSDN
Целочисленные литералы [+ -]? [0-9] + обрабатываются как System.Int32, System.Int64 или System.Double. System.Double может потерять точность в зависимости от того, насколько велико число. Например, если число в литерале равно 2147483650, DataSet сначала попытается проанализировать число как Int32. Это не удастся, потому что число слишком велико. В этом случае DataSet будет анализировать число как Int64, что будет успешным. Если литерал был числом больше максимального значения Int64, DataSet проанализирует литерал с использованием Double.