Подтвердить что ты не робот

Кастинг двойной как int, округляет или просто сбрасывает цифры?

Выполнение некоторых вычислений с удвоениями, которые затем должны быть приведены к int. Итак, у меня есть быстрый вопрос: при произнесении двойного слова 7.5 в int, он вернет 7.

Является ли это результатом округления или просто чередования чего-либо после десятичной точки?

Если это произведение округления, то оно умное, то есть от 0,1 до 0,5 оно округляется вниз и от 0,6 до 0,9 оно округляется?

Приветствия

4b9b3361

Ответ 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.