Как я могу разделить два целых числа, чтобы получить двойное число?


282

Как мне разделить два целых числа, чтобы получить двойное число?


10
Предполагая, что это было задано в интервью - целочисленное деление всегда приводит к целому числу. Вы должны использовать приведение типа, как показано ниже.
Сеш

2
Различные типы делений: целочисленные, с плавающей запятой, десятичные - обсуждаются в Почему целочисленное деление в c # возвращает целое число, а не число с плавающей запятой?
Майкл

Ответы:


460

Вы хотите бросить числа:

double num3 = (double)num1/(double)num2;

Примечание. Если какой-либо из аргументов в C # является a double, используется doubleделение, которое приводит к a double. Таким образом, будет работать следующее:

double num3 = (double)num1/num2;

Для получения дополнительной информации см .:

Dot Net Perls


3
Не знаю, то же самое ли это в C #, но C требует, чтобы вы разыгрывали только первое - это автоматически сделает double / int double.
paxdiablo

4
@Pax, Если какой-либо из аргументов в C или C # является двойным, используется двойное деление (что приводит к двойному).
Страгер

32
Будьте осторожны , чтобы не делать этого: - double num3 = (double)(num1/num2);. Это просто даст вам двойное представление результата целочисленного деления!
Одинокий кодер

Предположим, вам не нужна дополнительная точность, есть ли причина использовать doubleвместо float? Я вижу, что вопрос требует, doubleно мне все равно любопытно.
Кайл Делани

@KyleDelaney Просто потому, что в C # мы обычно используем doubleи нет float. Когда вы пишете переменную, как var a = 1.0;это, этот 1.0 всегда является double. Я думаю, это главная причина.
this.myself

31

Дополняя ответ @ NoahD

Для большей точности вы можете привести к десятичному типу:

(decimal)100/863
//0.1158748551564310544611819235

Или:

Decimal.Divide(100, 863)
//0.1158748551564310544611819235

Double представлены распределением 64 бита, в то время как десятичное использует 128

(double)100/863
//0.11587485515643106

Углубленное объяснение «точности»

Для получения более подробной информации о точке представлении с плавающей запятой в двоичном и его точности , посмотрите на этой статье от Jon тарелочек , где он говорит о том, floatsи doublesи этом , где он говорит о decimals.


2
Неправильно! doubleимеет точность 53 бита, и это двоичный формат с плавающей запятой, тогда decimalкак ... десятичный, конечно, с точностью 96 бит . Так doubleчто с точностью до ~ 15-17 десятичных цифр и десятичных 28-29 цифр (и не в два раза больше точности double). Что еще более важно на decimalсамом деле использует только 102 из 128 битов
phuclv

Спасибо @phuclv, исправил это. Я имел в виду "распределение пространства". Вы были правы насчет точности decimals(96), но у вас doublesесть 52 бита мантиссы , а не 53.
fabriciorissetto

1
да, у мантиссы 52 бита, но есть еще скрытый бит, в результате чего получается 53-битное значение. Это 52 или 53 бит точности с плавающей запятой?
phuclv

Decimal.Divide был отличным! Спасибо
Рикардо Г Сарайва

10

приведите целые числа к двойникам.


Чтобы быть точным, вы можете привести целое число к двойному, например, так: (double) myIntegerValue
Whiplash

5

Преобразование одного из них в двойное первое. Эта форма работает на многих языках:

 real_result = (int_numerator + 0.0) / int_denominator

1
Проще просто сделать ...var result = 1.0 * a / b;
Basic

@Basic есть 100 способов сделать это. Я предпочитаю сложение только потому, что оно быстрее, хотя кастинг, очевидно, еще быстрее.
Марк Рэнсом

1
var firstNumber=5000,
secondeNumber=37;

var decimalResult = decimal.Divide(firstNumber,secondeNumber);

Console.WriteLine(decimalResult );

1
Вопрос, кажется, требует doubleи нет decimal.
Кайл Делани
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.