Почему число с плавающей точкой, деленное на большее число с плавающей точкой, приводит к нулю, и как я могу избежать этого в C #? - PullRequest
1 голос
/ 31 марта 2010

Я пытался разделить (float)200 / (float)500, но результат равен 0.0. Почему это так и как мы можем получить 0,4 в результате? Большое спасибо.

Ответы [ 4 ]

3 голосов
/ 31 марта 2010

Это очень распространенная ошибка, каждый программист делает это хотя бы один раз. Существует два вида операторов деления, они оба используют один и тот же символ, целое число и число с плавающей точкой. Компилятор выбирает, который он использует, основываясь на типах операндов. Если оба левый и правый операнды являются целыми, то вы получите интегральное деление. Инструкция idiv в машинном коде. Который обрезается до нуля и дает интегральный результат.

Как только хотя бы один операнд является плавающей точкой, вы получите инструкцию fdiv в машинном коде и результат, который вы ищете. Достаточно просто привести (float) или (double), как вы делали в своем вопросе. Вам нужно только разыграть одного из них. Или используйте литерал с плавающей точкой, например 200f или 200.0

2 голосов
/ 31 марта 2010

Здесь все в порядке - я с Андреасом.

    Console.WriteLine((float)200 / (float)500);

    Console.WriteLine("Press any key to continue");
    Console.ReadKey(true);

Результат:

0,4

Нажмите любую клавишу для продолжения

2 голосов
/ 31 марта 2010

Это невозможно. Я могу думать о следующих сценариях:

  1. Вы приводите результат к целому числу; в этом случае оно округляется до 0
  2. 200 и 500 на самом деле не числа с плавающей точкой, а целые числа; тогда результатом будет целое число по умолчанию
  3. Способ печати числа с плавающей запятой либо преобразует его в целое, либо не отображает десятичные значения.
0 голосов
/ 03 августа 2013

Я столкнулся с этой проблемой в отладчике MonoDevelop с проектом Unity3D.Как-то в окне Evaluate отображается 1.0f / 10.0f = 0 long.Это всего лишь ошибка в MonoDevelop IDE.

...