2016-11-15 10 views
0

По моему калькулятору: (100-1)/2 = 49,5Почему C# раунд (100-1)/2 до 49 вместо 50?

Если у меня есть Int так:

int mid = (100 - 1)/2 

И печать середина даст мне:

49 

Почему будет ли C# дать мне 49 вместо 50? Разве вы не должны округлять до следующего целого числа, если оно равно .5, чтобы число было равно 50?

+1

No. Целочисленное деление всегда округляется вниз. –

+0

Крутится в направлении 0? – Parentheses

+5

@EliSadoff - технически это усекает, но эффект тот же – ChrisF

ответ

3

При выполнении целочисленного деления (под которым мы подразумеваем оба аргумента являются целыми типами), CLR будет усекать результат; эффективно округляя положительные результаты.

Если вы хотите «стандартное» или среднюю точки округления, вам нужно явно использовать Math.Round и с плавающей точкой деления (по крайней мере один аргумент float, double или decimal).

+0

Незначительная вещь: C# не выполняет усечение, он просто выдает код 'div' op, который обрабатывается CIL. – Rob

+1

@ Rob Ok .... технически C# не делает * ничего *, но испускать op коды. Я исправлю это, хотя :) – BradleyDotNET

3

Это не округление, но целочисленная арифметика, которая обрежет число с плавающей точкой, так что

(100 - 1)/2 == 99/2 = 49.5, который обрежет до 49

и

(100 - 1)/-2 = 99/-2 = -49,5, который обрезает до -49

Если вы хотите провести реальное округление, вы должны сделать хотя бы одну из переменных величиной с плавающей запятой, а затем набрать Math.Round.

1

Как уже упоминалось, целочисленное деление будет усекать. Это имеет смысл с 99 % 2 == 1, и вы ожидаете, что вычитание модуля из исходного значения не изменит результат деления, т. Е. (99/2 == (99- (99% 2))/2), поэтому 99/2 = 98/2