Неоднозначный вызов Math.Round (int64 / int64, int)

1

Я хотел бы сделать процент с большим числом (int64: 600 851 475 143)

Моя действительная операция

a = Math.round(i / 600851475143 * 100, 5);

С я также int64 между 1 и 600851475143. Результат будет между 0,00000% и 100,00000%, если я прав.

Но Visual Studio Express 2013 говорит мне, что этот неоднозначный вызов между методами "System.Math.Round(decimal, int)" и "System.Math.Round(double, int)".

Как сказать визуально, что хорошие методы - System.Math.Round(decimal, int), даже если некоторые операции int64 находятся в операции?

Бонус: Чтобы понять мою проблему, я пытаюсь решить проблему ProjectEuler.net 3: "Основными факторами 13195 являются 5, 7, 13 и 29. Какой самый большой простой коэффициент числа 600851475143?"

Я сделал свой метод, и он работает с 13195. Но теперь я должен сделать это с помощью 600851475143 (в системе x64), но мой алгоритм, похоже, не оптимизирован, и я бы хотел добавить индикатор прогресса в процентах, чтобы узнать, произошел ли сбой EXE или не. Мой var - это процент...

Я НЕ ХОЧУ ОТВЕТ ПО ВОПРОСУ Euleur 3, мне просто нужно исправить мою процентную проблему...

Теги:
ambiguous
decimal
double
rounding

2 ответа

3
Лучший ответ

Маркировка числового значения с помощью M после того, как оно сделает десятичное значение. И используйте правильную перегрузку для Round.

var a = Math.Round(i / 600851475143M * 100, 5);
6

Если i является целым числом, тогда фактор равен нулю или одному, поскольку целое число, деленное на целое число, всегда является целым числом в С#. Вы хотели сказать

a = Math.round(i / 600851475143.0 * 100.0, 5);

Который заставляет вычисление быть в двухлокальных или

a = Math.round(i / 600851475143.0m * 100.0m, 5);

Который заставляет его быть десятичным.

Сообщение об ошибке правильное - неоднозначно, следует ли преобразовать целочисленный результат в десятичный или двойной. Это просто не указывает на более фундаментальную ошибку.

Кстати, эта ошибка чрезвычайно распространена. Настолько обычным явлением, что моя команда работает над статическим анализатором, чтобы его обнаружить. Теперь удаленный ответ фактически дал форму ошибки, которую я вижу довольно часто:

a = Math.round((decimal)(i / 600851475143 * 100), 5);

Это устраняет двусмысленность - очевидно, вы имели в виду decimal перегрузку, но вычисление выполняется в целых числах, округленных до целых чисел, а затем преобразованных в десятичные числа! Если вы собираетесь поставить бросок, он должен находиться на одном из операндов, а не на результате.

  • 0
    Конечно, OP также может делать a = Math.round(i / 6008514751.43, 5);
  • 0
    @KrisVandermotten Это не будет использовать десятичную перегрузку.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню