2009-07-30 3 views
8

В результате все деления уравнений ниже цикл равен 0. Как я могу получить его, чтобы дать мне десятичную, например:Почему эти уравнения деления приводят к нулю?

297/315 = 0.30793650793650793650793650793651 

Код:

using System; 

namespace TestDivide 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      for (int i = 0; i <= 100; i++) 
      { 
       decimal result = i/100; 
       long result2 = i/100; 
       double result3 = i/100; 
       float result4 = i/100; 
       Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i/100, result, result2, result3, result4); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Ответ:

Спасибо Джон и все, это то, что я хотел бы сделать:

using System; 

namespace TestDivide 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int maximum = 300; 

      for (int i = 0; i <= maximum; i++) 
      { 
       float percentage = (i/(float)maximum) * 100f; 
       Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

ответ

29

Вы используете Int/INT, который делает все, что в целочисленной арифметике, даже если вы присваиваете к десятичной/двойной/всплывают переменной ,

Настройте один из операндов того типа, который вы хотите использовать для арифметики.

for (int i = 0; i <= 100; i++) 
{ 
    decimal result = i/100m; 
    long result2 = i/100; 
    double result3 = i/100d; 
    float result4 = i/100f; 
    Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", 
         i, 100, i/100d, result, result2, result3, result4); 
} 

Результаты:

0/100=0 (0,0,0, 0) 
1/100=0.01 (0.01,0,0.01, 0.01) 
2/100=0.02 (0.02,0,0.02, 0.02) 
3/100=0.03 (0.03,0,0.03, 0.03) 
4/100=0.04 (0.04,0,0.04, 0.04) 
5/100=0.05 (0.05,0,0.05, 0.05) 

(и т.д.)

Обратите внимание, что это не является показывает точное значение, представленное теркой или двойной - вы не можете представлять 0,01 точно, например, как float или double. Форматирование строк эффективно округляет результат. См. Мой article on .NET floating binary point для получения дополнительной информации, а также класса, который позволит вам увидеть точный значение двойного.

Я не беспокоился, используя 100L для result2, потому что результат всегда будет таким же.

0

Потому что i является значением int и вы делите на целое число, поэтому результат является целым числом! и поэтому вам нужно разделить на 100,0 иметь неявное приведение в поплавке или указать 100f или 100d

11

Попробуй

i/100.0 
+0

+1. Это так просто;) – AnthonyWJones

+0

Этот ответ получит от меня повышенный интерес, если он также объяснит * почему * это сработает; o) –

+0

Код из вопросов не работает, потому что «/» - оператор, вызываемый с целыми аргументами, имеет целое число split.If любой из аргументов float или double, тогда «/» выполняет деление, которое вы ожидаете. : 0) – Lloyd

5

потому что i является INT: целочисленное деление i/100 выполняет, то результат , который всегда равен 0, присваивается типу цели. Необходимо указать, по крайней мере, один не-ИНТ буквальным в своем выражении:

i/100.0 
2

Поскольку я целое и 100 представляет собой целое число ... поэтому у вас есть целое подразделение

Try (десятичное) я/100,0 вместо

1

Независимо от того, где вы храните его, целое число, деленное на целое число всегда будет целым числом.

0

это целочисленное деление независимо от типа переменной, хранения в, так INT/INT = INT

1

Вы должны заставить операцию с плавающей точкой «двойной/двойной» вместо «междунар/ИНТ»

double result = (double)297/(double)315 ; 
5

Я знаю, что это не точка вопроса ... но я думаю, что 297,0/315 является +0,942857142857143, а не 0,30793650793650793650793650793651.

:)

0

В моем случае я не имел только вары и не ИНТ

float div = (var1 - var2)/float.Parse(var1.ToString()); 
Смежные вопросы