I have an integer (representing seconds) which I'm converting to hours by dividing by 3600. I then store the value in a property (type int). If the value contains a decimal point, I convert it by casting. However, when I try to assign the value to the property, I get an error: "Cannot implicitly convert type 'decimal' to 'int'." Here's my code:
var p = ((Hours.Duration) / 3600.0);
(Hours.Duration) = p;
However,
Hours.Duration = (Hours.Duration) / 3600
works fine, and rounds to an int. What am I doing wrong?
decimal p = ((Hours.Duration) / 3600);
(Hours.Duration) = p;
you are getting error because p is decimal and Hours.Duration is integer, You cannot assign decimal to int without explicit casting.
(Hours.Duration) = (int)p;
If Hours.Duration is integer, 3600 is also integer, then there will be an integer division, that is your decimal value will be lost. e.g. in integer division 7/2 =3. If you want the answer to be 3.5, then you need to have atleast one decimal number in the division i.e 7.0/2 = 3.5 OR 7/2.0 = 3.5.
Try:
Hours.Duration = Convert.ToInt32(p);
Don't define p as decimal. And the question is, if you want to include also partial hour (e.g. if the result for 4000/3600 would be 1 or 2). So you can write directly
Hours.Duration /= 3600;
or if you want count also partial hour
Hours.Duration = Hours.Duration / 3600 + ((Hours.Duration % 3600 > 0)?1:0);
or if you want correct rounding up
Hours.Duration = Hours.Duration / 3600 + ((Hours.Duration % 3600 >= 1800)?1:0);
You can use this code:
int vIn = 0;
double vOut = Convert.ToDouble(vIn);
Here is a very handy convert data type webpage for those of others: Convert decimal to int in C#
Related
This simple calculation is returning zero, I can't figure it out:
decimal share = (18 / 58) * 100;
You are working with integers here. Try using decimals for all the numbers in your calculation.
decimal share = (18m / 58m) * 100m;
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;
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() );
Because the numbers are integers and you perform integer division.
18 / 58 is 0 in integer division.
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}");
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
decimal share = (18 * 100)/58;
Solved: working perfectly with me
int a = 375;
int b = 699;
decimal ab = (decimal)a / b * 100;
Here is the code which made me post this question.
// int integer;
// int fraction;
// double arg = 110.1;
this.integer = (int)(arg);
this.fraction = (int)((arg - this.integer) * 100);
The variable integer is getting 110. That's OK.
The variable fraction is getting 9, however I am expecting 10.
What is wrong?
Update
It seems I have discovered that the source of the problem is subtraction
arg - this.integer
Its result is 0.099999999999994316.
Now I am wondering how I should correctly subtract so that the result was 0.1.
You have this:
fraction = (int)((110.1 - 110) * 100);
The inner part ((110.1 - 110) * 100), will be 9.999999
When you cast it to int, it will be round off to 9
This is because of "floating point" (see here) limitations:
Computers always need some way of representing data, and ultimately
those representations will always boil down to binary (0s and 1s).
Integers are easy to represent, but non-integers are a bit more
tricky. Consider the following var:
double x = 0.1d;
The variable x will actually store the closest available double to
that value. When you understand this, it becomes obvious why some
calculations seem to be "wrong".
If you were asked to add a third to a third, but could only use 3
decimal places, you'd get the "wrong" answer: the closest you could
get to a third is 0.333, and adding two of those together gives 0.666,
rather than 0.667 (which is closer to the exact value of two thirds).
Update:
In financial applications or where the numbers are so important to be exact, you can use decimal data type:
(int)((110.1m - 110) * 100) //will be 10 (m is decimal symbol)
or:
decimal arg = 110.1m;
int integer = (int)(arg); //110
decimal fraction = (int)((arg - integer) * 100); //will be 10
It is because you are using double, precision gets rounded, if you want it to be 10 use decimal type:
check the following:
int integer;
int fraction;
decimal arg = 110.1M;
integer = (int)(arg);
decimal diff = arg - integer;
decimal multiply = diff * 100;
fraction = (int)multiply;//output will be 10 as you expect
I want to calculate a percentage. My code is:
Bot.Log("[ KEYBOT ] The total is " + (suctrades * totaltrades ) / 100 + "% !");
If I do this, I only get 0. What am I doing wrong?
Probably suctrades * totaltrades is still an int. The easiest way will be probably changing your code to:
((double)suctrades) * totaltrades/100
Or
suctrades * totaltrades/100.0
To force using double instead of int
Try :
Bot.Log("[ KEYBOT ] The total is " + ((double)suctrades * totaltrades ) / 100 + "% !");
I assume suctrades and totaltrades are not of decimal type. This should fix this due to type propagation as expression is evaluated.
Int is an integer type; dividing two ints performs an integer division, i.e. the fractional part is truncated since it can't be stored in the result type (also int!). Decimal, by contrast, has got a fractional part. By invoking Decimal.Divide, your int arguments get implicitly converted to Decimals.
You can enforce non-integer division on int arguments by explicitly casting at least one of the arguments to a floating-point type, e.g.: 100.0m this is casting to decimal !
decimal result = suctrades * totaltrades/100.0m
I am using MVC3 with c# and I'm trying to get the percentage from the following in my model:
I retrieve the numbers:
... Code omitted
AgeGroup = g.Key.AgeGroup,
Count = (int)g.Count(),
Total = (int)
(from vw_masterview0 in ctx.vw_MasterViews
select new
{
vw_masterview0.ClientID
}).Count()
... Code omitted
I need to divide:
percent = Count/Total * 100
I have no idea how to format this in Linq.
You first need to cast to decimal or double to avoid integer division. After multiplying with 100 and rounding, you need to cast back to int.
The casts of the Count()s to int on the other hand are useless, Count() already returns an integer.
int count = g.Count();
int total = ctx.vw_MasterViews.Count();
int percent = (int)Math.Round((Decimal)count/(Decimal)total*100, MidpointRounding.AwayFromZero);
I have this function I am writing.
const int ProgressBarLength = 230;
foreach (TransactionDetail item in list)
{
var itemProgress =
((ProgressBarLength/item.PurchasesRequired) *
Convert.ToInt32(item.TransactionAmount));
item.ProgressBar = itemProgress > ProgressBarLength ? ProgressBarLength : itemProgress;
}
Now I have 2 TransactionDetails in my loop.
If item.PurchasesRequired = 500 and TransactionAmount = 199.0 the resulting value is 0. However, if item.PurchasesRequired = 5 and TransactionAmount = 94.0 it returns a valid result.
What am I doing wrong?
Is item.PurchasesRequired an int?
If so, your problem is integer division.
ProgressBarLength is an int, so 230/500 = 0.
Use float, double, or decimal (either in a cast or for your ProgressBarLength) to maintain your desired level of precision.
I'm guessing you should do a cast to double somewhere to have more precision in your divisions. When dividing an int by an int, you won't get a double as result.
Try the following:
double itemProgress = ( ((double)ProgressBarLength / item.PurchasesRequired )
* Convert.ToInt32( item.TransactionAmount ) );
It looks like you're performing integer division.
230 / 500 is zero in integer division, whereas 230 / 5 is 46.
You can force floating-point division by casting PurchasesRequired to a double. 230 / 500 is 0.46 in floating-point division, as you'd expect.
const int ProgressBarLength = 230;
foreach (TransactionDetail item in list)
{
var itemProgress = ((ProgressBarLength / (double)item.PurchasesRequired)
* Convert.ToInt32(item.TransactionAmount));
item.ProgressBar = Math.Min((int)itemProgress, ProgressBarLength);
}
I'm guessing TransactionDetail.PurchaseRequired is a field or property of type int.
ProgressBarLength/item.PurchasesRequired divides an in by an int which results in an int, not a float. in your first example, 230 / 500 does integer division and the result is, of course, 0.
You can either calculate the expression as a double, or do the multiplication first so that you don't lose relevant precision from the integer division.
var itemProgress = (double) ProgressBarLength / item.PurchasesRequired * item.TransactionAmount;
or
var itemProgress = ProgressBarLength * (int) item.TransactionAmount / item.PurchasesRequired));