Кастинг двойной как int, округляет или просто сбрасывает цифры?
Выполнение некоторых вычислений с удвоениями, которые затем должны быть приведены к int. Итак, у меня есть быстрый вопрос: при произнесении двойного слова 7.5 в int, он вернет 7.
Является ли это результатом округления или просто чередования чего-либо после десятичной точки?
Если это произведение округления, то оно умное, то есть от 0,1 до 0,5 оно округляется вниз и от 0,6 до 0,9 оно округляется?
Приветствия
Ответы
Ответ 1
Он не округляется, он возвращает интегральную часть до десятичной точки.
Ссылка (спасибо Rawling): Явная таблица числовых преобразований
Вы можете попробовать простые проблемы, подобные этому, написав простые тесты. Следующий тест (используя NUnit) пройдет и, следовательно, даст ответ на ваш вопрос:
[Test]
public void Cast_float_to_int_will_not_round_but_truncate
{
var x = 3.9f;
Assert.That((int)x == 3); // <-- This will pass
}
Ответ 2
Простое литье всего лишь разделит все за десятичной точкой. Чтобы округлить вверх или вниз, вы можете использовать метод Math.Round(). Это будет округлено вверх или вниз и даст параметр о том, что делать, если он находится на полпути. Вы также можете использовать Math.Floor() или Math.Ceiling() для неявного округления или округления до литья. Вот несколько примеров:
double num1 = 3.5;
double num2 = 3.2;
double num3 = 3.9;
(int)num1 // returns 3;
(int)num2 // returns 3;
(int)num3 // returns 3 also;
(int)Math.Round(num1) // returns 4
(int)Math.Round(num2) // returns 3
(int)Math.Round(num3) // returns 4
(int)Math.Floor(num1) // returns 3
(int)Math.Floor(num2) // returns 3
(int)Math.Floor(num3) // returns 3
(int)Math.Ceiling(num1) // returns 4
(int)Math.Ceiling(num2) // returns 4;
(int)Math.Ceiling(num3) // returns 4;
Ответ 3
Не обманывайте себя, полагая, что он округляется. Он удаляет десятичную дробь и чисто возвращает целую часть двойника. Это важно с отрицательными числами, потому что округление вниз с 2.75 дает вам 2, но округление от -2,75 дает вам -3. Кастинг не округляется так (int) 2.75 дает 2, но (int) -2.75 дает вам -2.
double positiveDouble = 2.75;
double negativeDouble = -2.75;
int positiveInteger = (int) positiveDouble;
int negativeInteger = (int) negativeDouble;
Console.WriteLine(positiveInteger + " = (int)" + positiveDouble);
Console.WriteLine(negativeInteger + " = (int)" + negativeDouble);
Console.ReadLine();
//Output: 2 = (int)2.75
// -2 = (int)-2.75
Ответ 4
Он принимает целую часть
double d = 0.9;
System.Console.WriteLine((int)d);
результат 0
Ответ 5
Если он возвращает 7 для двойника 7.5, то он не округляется, потому что правила округления будут диктовать, что все 5 и выше округляются, а не вниз.
Ответ 6
Из Спецификация языка С#:
В контексте unchecked
преобразование всегда выполняется успешно, и поступает следующим образом.
• Если значение операнда NaN или бесконечно, результатом преобразования является неуказанное значение тип назначения.
• В противном случае исходный операнд округляется в направлении от нуля до ближайшего целочисленного значения. Если это целочисленное значение находится внутри диапазон типа назначения, то это значение является результатом преобразование.
• В противном случае результатом преобразования является неопределенное значение типа адресата.
См. также Явная таблица числовых преобразований - Примечания в MSDN.
Ответ 7
Нормальный литой, подобный этому
int number;
double decimals = 7.8987;
number = (int)decimals;
вернет число = 7. Это потому, что он просто пропускает наименее значимые числа. Если вы хотите, чтобы он округлился правильно, вы можете использовать Math.Round() следующим образом:
number = (int)Math.Round(number);
Это вернет число = 8.