Zo Has
Zo Has

Reputation: 13028

Division returns zero

This simple calculation is returning zero, I can't figure it out:

decimal share = (18 / 58) * 100;

Upvotes: 74

Views: 74548

Answers (8)

Abdul Khaliq
Abdul Khaliq

Reputation: 2285

Solved: working perfectly with me

  int a = 375;
  int b = 699;
  decimal ab = (decimal)a / b * 100;

Upvotes: 0

aris
aris

Reputation: 597

 double res= (firstIntVar * 100f / secondIntVar) / 100f;

when dividing numbers I use double or decimal , else I am getting 0 , with this code even if firstIntVar && secondIntVar are int it will return the expected answer

Upvotes: 2

Daniel Lee
Daniel Lee

Reputation: 7969

You are working with integers here. Try using decimals for all the numbers in your calculation.

decimal share = (18m / 58m) * 100m;

Upvotes: 93

Kraang Prime
Kraang Prime

Reputation: 10479

Since some people are linking to this from pretty much any thread where the calculation result is a 0, I am adding this as a solution as not all the other answers apply to case scenarios.

The concept of needing to do calculations on various types in order to obtain that type as a result applies, however above only shows 'decimal' and uses it's short form such as 18m as one of the variables to be calculated.

// declare and define initial variables.
int x = 0;
int y = 100;

// set the value of 'x'    
x = 44;

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0.
Console.WriteLine( (x / y).ToString() );

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0. The conversion to double happens 
// after the calculation has been completed, so technically this results
// in 0.0
Console.WriteLine( ((double)(x / y)).ToString() );

// Results in 0.44 as the variables are cast prior to calculating
// into double which allows for fractions less than 1.
Console.WriteLine( ((double)x / (double)y).ToString() );

Upvotes: 22

adonthy
adonthy

Reputation: 171

Whenever I encounter such situations, I just upcast the numerator.

double x = 12.0 / 23409;
decimal y = 12m / 24309;

Console.WriteLine($"x = {x} y = {y}");

Upvotes: 5

Prabhavith
Prabhavith

Reputation: 486

decimal share = (18 * 100)/58;

Upvotes: 1

Albin Sunnanbo
Albin Sunnanbo

Reputation: 47038

Because the numbers are integers and you perform integer division.

18 / 58 is 0 in integer division.

Upvotes: 4

Petar Ivanov
Petar Ivanov

Reputation: 93030

18 / 58 is an integer division, which results in 0.

If you want decimal division, you need to use decimal literals:

decimal share = (18m / 58m) * 100m;

Upvotes: 29

Related Questions