Возвращаемое значение: округлено до ближайшего 32-разрядного целого числа со знаком. Если значение находится посередине между двумя целыми числами, возвращается четное число; то есть 4,5 преобразуется в 4, а 5,5 преобразуется в 6.
При преобразовании значения double или float в целочисленный тип значение усекается.
Обновление: см. Комментарий Джеппе Стига Нильсена ниже для дополнительных различий (которые, однако, не вступают в игру, если scoreэто действительное число, как здесь).
Ваша ссылка на самом деле объясняет это лучше всего, и это не так просто, как round vs truncate: Type: System.Int32 value, округленное до ближайшего 32-битного целого числа со знаком. Если значение находится посередине между двумя целыми числами, возвращается четное число; то есть 4.5 конвертируется в 4, а 5.5 конвертируется в 6.
ericosg
@ericosg: Да, что бы маскировать разницу , если scoreбыли 8.5вместо 8.6. Я обновил ответ, включив цитаты. Спасибо за вклад.
Джон
5
И если scoreравно NaNили бесконечность или конечное значение, но вне диапазона Int32, то Convert.ToInt32будет выдано исключение. Cast вернет int, но вы не узнаете, какой из них (в моей реализации это Int32.MinValue), потому что вы находитесь в uncheckedконтексте. (Если вы находитесь в checkedконтексте, актерский состав также вызовет исключение в этих случаях.)
Йеппе Стиг Нильсен
@JeppeStigNielsen: Спасибо за ввод, я обновил ответ, чтобы упомянуть и об этом.
Джон
Ницца. Но я думаю, что Doubleтиповое число 10000000000.6(десять миллиардов целых шесть десятых) - это «реальное» число. Использование приведения к intэтому даст странный результат (если вы не находитесь в checkedконтексте, но, вероятно, это не так).
Йеппе Стиг Нильсен
13
Приведение игнорирует все, что находится после десятичной точки, поэтому 8,6 становится 8.
Convert.ToInt32(8.6) - это безопасный способ обеспечить округление двойного числа до ближайшего целого числа, в данном случае 9.
теперь вопрос как сделать i1 == i2. Вопрос был в том, почему они не равны. Проголосовали против.
Adam
5
В приведенном примере ваше десятичное число - 8,6 . Если бы это было 8.5 или 9.5, утверждение i1 == i2 могло бы быть правдой. Фактически, это было бы верно для 8,5 и ложно для 9,5.
Пояснение:
Независимо от десятичной части, второй оператор int i2 = (int)scoreотбросит десятичную часть и просто вернет вам целую часть. Это довольно опасная вещь, так как может произойти потеря данных.
Теперь для первого утверждения могут произойти две вещи. Если десятичная часть равна 5, то есть наполовину, необходимо принять решение. Мы округляем в большую или меньшую сторону? В C # класс Convert реализует банковское округление. См. Этот ответ для более глубокого объяснения. Проще говоря, если число четное, округлить в меньшую сторону, если число нечетное - округлить в большую сторону.
Math.Truncate(score)
более явно выраженное намерение, чем(int)score
Ответы:
Потому что
Convert.ToInt32
раундов:... пока приведение обрезается :
Обновление: см. Комментарий Джеппе Стига Нильсена ниже для дополнительных различий (которые, однако, не вступают в игру, если
score
это действительное число, как здесь).источник
score
были8.5
вместо8.6
. Я обновил ответ, включив цитаты. Спасибо за вклад.score
равноNaN
или бесконечность или конечное значение, но вне диапазонаInt32
, тоConvert.ToInt32
будет выдано исключение. Cast вернетint
, но вы не узнаете, какой из них (в моей реализации этоInt32.MinValue
), потому что вы находитесь вunchecked
контексте. (Если вы находитесь вchecked
контексте, актерский состав также вызовет исключение в этих случаях.)Double
типовое число10000000000.6
(десять миллиардов целых шесть десятых) - это «реальное» число. Использование приведения кint
этому даст странный результат (если вы не находитесь вchecked
контексте, но, вероятно, это не так).Приведение игнорирует все, что находится после десятичной точки, поэтому 8,6 становится 8.
Convert.ToInt32(8.6)
- это безопасный способ обеспечить округление двойного числа до ближайшего целого числа, в данном случае 9.источник
вы можете округлить свой дубль и бросить его:
источник
i1 == i2
. Вопрос был в том, почему они не равны. Проголосовали против.В приведенном примере ваше десятичное число - 8,6 . Если бы это было 8.5 или 9.5, утверждение i1 == i2 могло бы быть правдой. Фактически, это было бы верно для 8,5 и ложно для 9,5.
Пояснение:
Независимо от десятичной части, второй оператор
int i2 = (int)score
отбросит десятичную часть и просто вернет вам целую часть. Это довольно опасная вещь, так как может произойти потеря данных.Теперь для первого утверждения могут произойти две вещи. Если десятичная часть равна 5, то есть наполовину, необходимо принять решение. Мы округляем в большую или меньшую сторону? В C # класс Convert реализует банковское округление. См. Этот ответ для более глубокого объяснения. Проще говоря, если число четное, округлить в меньшую сторону, если число нечетное - округлить в большую сторону.
Например, рассмотрите:
источник
ToInt32 раундов. Приведение к int просто отбрасывает нецелочисленный компонент.
источник