Explanation of casting/conversion int/double in C# - c#

I coded some calculation stuff (I copied below a really simplifed example of what I did) like CASE2 and got bad results. Refactored the code like CASE1 and worked fine. I know there is an implicit cast in CASE 2, but not sure of the full reason. Any one could explain me what´s exactly happening below?
//CASE 1, result 5.5
double auxMedia = (5 + 6);
auxMedia = auxMedia / 2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
//CASE 3, result 5.5
double auxMedia3 = (5.0 + 6.0) / 2.0;
//CASE 4, result 5.5
double auxMedia4 = (5 + 6) / 2.0;
My guess is that /2 in CASE2 is casting (5 + 6) to int and causing round of division to 5, then casted again to double and converted to 5.0.
CASE3 and CASE 4 also fixes the problem.

5 + 6 is integer 11; which you then cast to double (in the assignment) and divide by two; 5.5
5 + 6 is integer 11; integer 11 / 2 = 5 under integer arithmetic, which you then cast to double (in the assignment)
5.0 + 6.0 is double 11.0; divide by double 2.0 giving double 5.5
5 + 6 is integer 11; there is an implicit cast to double 11.0 for the division, then divide double 2.0 giving double 5.5

To expand on Marc's (correct) answer a bit, whole numbers are interpreted as integer, whereas numbers with decimal points are interpreted as double. To declare a whole number as a literal double, append a "D" to it:
//CASE 2b, result 5.5
double auxMedia2b = (5D + 6D) / 2;

You are correct. CASE 2 uses integer arithmetic until the assignment is made. You can also fix the problem by making an explicit cast:
double auxMedia1 = ((double) (5 + 6)) / 2;

//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;
The result of the (5 + 6) operation is integer. Because both operands are of type integer. Then, the compiler performs 11 / 2, where both operand are also integers. The result of the last division is obviously 5, because it is an integer division (don't know the proper English word).

Related

Math.Round for a decimal number

Code:
double PagesCount = 9 / 6 ;
Console.WriteLine(Math.Round(PagesCount, 0));
I'm trying to round the answer to 9/6(1,5) to 2 but this code snippet always results in 1.
How can I avoid that?
9 / 6 is an integer division which returns an integer, which is then cast to a double in your code.
To get double division behavior, try
double PagesCount = 9d / 6 ;
Console.WriteLine(Math.Round(PagesCount, 0));
(BTW I'm picky but decimal in the .net world refers base 10 numbers, unlike the base 2 numbers in your code)
Math.Round is not the problem here.
9.0 / 6.0 ==> 1.5 but 9 / 6 ==> 1 because in the second case an integer division is performed.
In the mixed cases 9.0 / 6 and 9 / 6.0, the int is converted to double and a double division is performed. If the numbers are given as int variables, this means that is enough to convert one of them to double:
(double)i / j ==> 1.5
Note that the integer division is complemented by the modulo operator % which yields the remainder of this division:
9 / 6 ==> 1
9 % 6 ==> 3
because 6 * 1 + 3 ==> 9

failed/success percentage from total items [duplicate]

This question already has answers here:
Why does integer division in C# return an integer and not a float?
(8 answers)
Closed 7 years ago.
Let's assume I have 8 items.
From these 8, 5 are success and 3 failure.
If I want to get the success and failure in percentage with 2 decimals precission I will do like this:
int total = 8;
int success = 5;
int failure = 3;
string success =((decimal)((success * 100) / total)).FormatDecimal();
string failure = ((decimal)((failure * 100) / total)).FormatDecimal();
Format decimal is an extension that will convert decimal to string with x amount of decimals.
public static string FormatDecimal(this decimal value, int decimals = 2)
{
return value.ToString(string.Format("0.{0}", new string('0', decimals)));
}
Now if I take my calculator and I do this, the result is correct:
success: (5 * 100) / 8 = 62.5 %
failure: (3 * 100) / 8 = 37.5 %
However my solution return me 62.00 % and 37.00%
What's wrong with my code?
Because your code is running with integer division but you calculator can do floating-point division.
Your (5 * 100) / 8 returns 62, not 62.5 since both operand is int and this operation will always disregards fractional part.
From / Operator (C# Reference)
When you divide two integers, the result is always an integer. For
example, the result of 7 / 3 is 2.
If you change your total to double, you can fix this since you start doing floating-point division not integer division.
double total = 8.0;
Check out;
7.7.2 Division operator
That's because the division operator / for integers only return the integer part.
If need to cast to float, double or decimal.
var result = ((float)(5 * 100)) / 8;
If any of the values you are dividing is a float, double or decimal, the division operator will support the decimal part.
This is very basic mistake at C#. You have defined the calculation wrong.
(success * 100) / total
It means that after success * 100, the result will be parsed as integer. It is now 300 in integer. 300 / 8 = 37 in integer.
Instead, you can replace the 100 with 100m to force convert them to decimal.

Unexpected double value in c# [duplicate]

This question already has answers here:
Why does integer division in C# return an integer and not a float?
(8 answers)
Closed 9 years ago.
Today i come with a problem and not able to figure out what is the issue with this simple statement
I Tried
double d =1/4;
expected ans for me is 0.25 but in reality ans is 0.0 why so ??
And what should we do if statement is in terms of integer variables like this
double a =(a-b)/(d+e);
Because what you done is here integer division. 1 / 4 always give you 0 as a result regardless which type you assing it.
.NET has 3 type of division. From 7.7.2 Division operator
Integer division
Floating-point division
Decimal division
From Integer division part;
The division rounds the result towards zero, and the absolute value of
the result is the largest possible integer that is less than the
absolute value of the quotient of the two operands.
If you want to 0.25 as a result, you should define one of your values as a floating point.
You can use one of these;
double d = 1d / 4d;
double d = 1d / 4;
double d = 1 / 4d;
And what should we do if statement is in terms of integer variables
like this
double a =(a-b)/(d+e);
I assume your a, b, d and e are integers, you should use one of these then;
double a = (double)(a-b) / (double)(d+e);
double a = (a-b) / (double)(d+e);
double a = (double)(a-b) / (d+e);
double d =1d/4;
should work.
If you don't specify the type of your numbers, it is treated as Integer. And integer 1/4 will be zero.
Use this:
double d = (double) 1 / 4;
/ Operator (msdn)
When you divide two integers, the result is always an integer. For
example, the result of 7 / 3 is 2. To determine the remainder of 7 /
3, use the remainder operator (%). To obtain a quotient as a rational
number or fraction, give the dividend or divisor type float or type
double. You can assign the type implicitly if you express the dividend
or divisor as a decimal by putting a digit to the right side of the
decimal point.
Try this:
double d = 1.0 / 4.0;

Library to evaluate numerical expressions

is there a .NET library that can perform a numerical operation and return a value?
I have an expression like so:
1 + 1/2
this should return the double equivalent of the same.
I wont be passing a string, it will be a numeric value and the return should be a numeric.
I've used NCalc for medium-to-complex calculations and it seems that it will fit your needs.
About the OP's comment on the original question:
double d = 1/2;
will return 0 in c#, because the integer 1 is divided by the integer 2, resulting in an integer result of 0.
If you need to trigger real-number mathematics, at least one of the operands must be defined as a real number. You can do that by specifying it with a decimal point (1.0 instead of 1), or by adding a type specifier after the value (1f or 1d instead of 1).
Take a look at this example:
double d1 = (1 + 1/2); //returns 1
double d2 = (1 + 1.0/2); //returns 1.5
double d3 = (1 + 1/2.0); //returns 1.5
double d4 = (1 + 1f/2); //returns 1.5
double d5 = (1 + 1d/2); //returns 1.5
See here CodeDom Calculator - Evaluating C# Math Expressions Dynamically

Multiplication on floating numbers returns unexpected result

int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
The result of that phrase is unexpected, I get zero.
Why won't it work?
You are doing an integer division on (countBouncy / count). Change your code to
double percent = ((double)countBouncy / count) * 100.0;
That way, countBouncy is converted to double explicitly and count is converted to double implicitly by the c# compiler to make it compatible to the (now double) countBouncy.
Otherwise (countBouncy / count) is calculated as (5 / 999899) --> 0 since both are integers.
How does integer division work? Let's take an example:
7 / 2 = 3
Integer division drops the decimal part that a real division would yield. The result is truncated towards zero. You can get the remainder of this division by using the modulo operator
7 % 2 = 1
and perform the backward calculation like this
2 * (7 / 2) + 7 % 2 = 7
You can enter this in the immediate window of Visual Studio to test it:
?2 * (7 / 2) + 7 % 2<enter>
7
Because your division is integer division, which results in 0, which you then cast into a double.
Your current code is effectively the same as:
int temp = countBouncy / count; // == 0
double percent = (double)temp * 100.0;
Do you cast on one of the items first:
double percent = ((double)countBouncy / count) * 100.0;
That will cause your division to be done in double precision up front.
When you divide an int by an int, the result is always an int, so it's going to round down to the nearest integer (zero). Try this instead:
((double)countBouncy / count) * 100.0;
Your numerator and denominator are both ints. Hence, the resulting quotient is an int which C# calculates by rounding down to 0. Plus, you are trying to assign a double type to an int type. In order to achieve your desired result, do:
double percent = ((double) countBouncy / count) * 100.0;

Categories

Resources