C # dt.Compute () Не работает должным образом на некоторых умножениях - PullRequest
1 голос
/ 06 марта 2019

Добрый день,

У меня проблема с dt.Compute () в C #.

Проблема в том, что когда я пытаюсь вычислить что-то вроде этого: 500'000 * 5'000, чем я получаю:

System.OverflowException: "значение было слишком большим или слишком маленьким для 'int32'. "

Результат должен быть: 2'500'000'000, но c # получить такой результат: -2146233066 и это мало для int32.

Это работает, когда я пытаюсь вычислить 5 * 5 или 5'000'000'000 * 5'000'000, но когда я пытаюсь вычислить что-то вроде 5'000'000'000'000 * 5'000 '000'000 Я получаю эту ошибку:

System.OverflowException: "значение было слишком большим или слишком маленьким для 'int64'. "

но он снова работает, когда я вычисляю большие числа, так что это означает, что dt.Compute () имеет некоторые проблемы с умножением некоторых чисел, но работает с большими числами или меньшими числами.

Надеюсь, кто-то может помочь мне с этой проблемой.

Вот мой код:

string calculation = "500000*5000";
var anwser = dt.Compute(calculation, "");

string str_anwser = anwser.ToString();
RechnerOutput.Text = str_anwser;

1 Ответ

5 голосов
/ 06 марта 2019

Ну, вы просто не можете, максимальный размер 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...