making double variables lower than 1 - c#

in my ASP.NET project i did a survey page that uses Application to save the votes. I have a problem with the making of the percentages amount. I've tried many things. here is the problematic part of my code:
double x = (count / sum) ;
double f = (count1 / sum) ;
double g = (count2 / sum) ;
double h = (count3 / sum) ;
if (sum > 0)
{
a = (int)x * 100;
b = (int)f * 100;
c = (int)g * 100;
d = (int)h * 100;
}
I used breakpoints and figured out that the problem was in the double variables: the (count/sum) equals 0 anyway.

I'm assuming count and sum are integer types.
The result of division of 2 integers is a truncated integer.
You need to cast one side of the division to a double, then the result will be double
So
((double)count)/sum

What are the datatypes of count, count[1-3] and sum? If they are integral types, then integer division is performed. This
int x = 100 ;
int y = 300 ;
double z = x / y ;
yields the value 0.0 for z.
Try something like
double h = (double) ( count3 / sum ) ;
You might also want to move your test for sum > 0 up: as coded, if sum is zero, you'll throw a DivideByZeroException before you get to your test, thus rendering your test moot.

Your count and sum variables are probably integers. Cast one of them to double:
double x = count / (double)sum;
UPDATE:
Actually, if you want the percentage as an integer, you can skip the doubles altogether:
int a = 100 * count / sum;

Related

showing a percentage number for two variables in c# [duplicate]

This question already has answers here:
C# is rounding down divisions by itself
(10 answers)
Closed 6 years ago.
I have two variables, I want to showing as percentage, when I calculate them with operator the result is 0 why?
please help me. Thanks
this is my source
int count = (from a in dc.jawabans
where a.q14 == "5 : Sangat Baik/ Sangat Puas"
select a).Count();
TextBox1.Text = count.ToString();
int total = (from b in dc.jawabans
where b.q14 != ""
select b).Count();
TextBox2.Text = total.ToString();
int persen = (count / total) * 100;
TextBox3.Text = persen.ToString();
This is the result
count is int, total is int too. In C# when int divided by int the result is int. The solution is to cast one variable as double.
int persen = (int)((double)count / total * 100);
Write it like this:
decimal persen = (count / (decimal)total) * 100;
After that you can round it if you want:
TextBox3.Text = Math.Round(persen, 2).ToString();
Division of 2 integers is an integer, so you should specified that one of them is decimal.
Because you dividing two integers, so the result will be integer as well. You can set count and total as double , then you will get correct result.
This is because the sum you are doing is with ints, so the value is rounded to the nearest whole number - for example if count is 20, and total is 100
int persen = (count / total) * 100;
is the same as doing
int persen = (count / total); //this = 0 as it would evaluate to 0.2 => 0
persen = persen * 100; //still 0
Whereas
int persen = ((double)count / (double)total) * 100;
//This would be 20, as count and total are both cast to a double - it also works if you only cast one of them
decimal persen = (count / (decimal)total) * 100; //count 20, total 100, so person will be 0 if it is int in your code
If you devide int by int, it will give you int not double.
So either convert count or total as decimal or double according to your requirement.

Divide X by Y, return number of items in last, partial set

I'm probably missing something really simple, but I'm trying to figure out how to calculate what's left over after I divide X by Y. I don't mean the remainder, I mean, e.g. if I divide 100 by 7 => 6 groups of 15 + one group of 10, how do I get 10?
I don't have code to show because I have no idea where start. X and Y are both integers.
It's not as simple as just using modulus. The fiddly bit is calculating your initial group size from the number of groups.
Try this:
int population = 100;
int numberOfGroups = 7;
int groupSize = (population + numberOfGroups - 1)/numberOfGroups;
Console.WriteLine(groupSize);
int remainder = population%groupSize;
Console.WriteLine(remainder);
I don't mean the remainder
Yes you mean remainder.
If you divide 100 by 15, you get 6 as quotient and 10 as remainder.
use Modulus operator like
int remainder = 100 % 15; // This will return 6
int quotient = 100/15; // This will return 10
It's a modulo operator, isntead of:
var result = x / y;
Try this:
var result = x % y;
EDIT.
Ok You are very unclear but i think one of below solutions is what You are trying to avhieve.
S1. do this:
int x = 100/15;
int z = 15 * x;
int y = 100 - z; // and You got Your 10
S2. do this:
int x = 100/7;
if ( x * 7 != 100)
{
int GroupSize = x+1;
int rest = 100 - GroupSize;
}

C# Floating Point Accuracy

Trying to create a Mandelbrot set, I have been trying to using 8 and 15 digit floating point variables in my program, and have run into an issue: the double approximates to 0. I tried unit testing and wrote this code to isolate the issue. Using the variable viewer, the h and w values both were on 0.0, as opposed to 0.00185185185185 and 0.0015625, yet when I just write double h = 0.0015625, it works.
Many thanks for assistance.
int apparentwidth = 3;
int apparentheight = 2;
int height = 1080;
int width = 1920;
double w = (apparentwidth / width);
double h = (apparentheight / height);
Console.WriteLine(w);
Console.WriteLine(h);
You're dividing two int variables, and the result is an int. You're storing the result in a double, but the scale (portion after the decimal) has already been lost.
Use double throughout:
double apparentwidth = 3;
double apparentheight = 2;
double height = 1080;
double width = 1920;
double w = (apparentwidth / width);
double h = (apparentheight / height);
Or cast one of the variables to a double when dividing:
double w = ((double)apparentwidth / width);
double h = ((double)apparentheight / height);
You are doing integer division on accident.
double w = (double)apparentwidth / (double)width;
double h = (double)apparentheight / (double)height;
Just to provide further explanation to the other answers:
When you do mathematical operations on ints, the result is an int, and this is achieved by effectively truncating the non-integer portion:
3 / 2 == 1
When an operation is performed involving at least one double, the int input is first converted to a double, so the result is a double:
1.0 / 4 == 0.25
4 * 0.25 == 1
And of course, if both inputs are double the result is double and no implicit conversion occurs:
1.0 / 4.0 == 0.25

Extremely basic division equation not working in c#

I can't get this to divide into a decimal. It is rounding to value 0.
private void button24_Click(object sender, EventArgs e)
{
double x = 0;
x = 1 / 2;
ans.Text = x.ToString();
}
When I debug, x is zero before it is sent to the textbox 'ans.'
I tried..and string variable is still zero..
double x = 1/5;
string displayX = x.ToString("0.0000");
It's integer division and those are the expected outputs.
double x = 1.0 / 5; // this will not perform integer division
double x = 1/5; // this does (1/5 = 0).
double x = 1D / 5; // this will not because 1 is treated as a double
You can do one of the follow:
double x = 1;
double y = 1.5;
double ans = x / y;
Replace double x = 1/5 with double x = 1.0/5 and that should fix it. Because both numbers you're dividing are integers, it still processes it as an integer, rather than as a double. When you think through logically, it makes some sense - it does the division in whatever form those numbers are and then saves it to the variable; the variable type is inconsequential to the actual equation.
(I realize there are other answers already, but hopefully this will help you see why the issue exists.)

Why do these division equations result in zero?

The result of all of the division equations in the below for loop is 0. How can I get it to give me a decimal e.g.:
297 / 315 = 0.30793650793650793650793650793651
Code:
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();
}
}
}
Answer:
Thanks Jon and everyone, this is what I wanted to do:
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();
}
}
}
You're using int/int, which does everything in integer arithmetic even if you're assigning to a decimal/double/float variable.
Force one of the operands to be of the type you want to use for the arithmetic.
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);
}
Results:
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)
(etc)
Note that that isn't showing the exact value represented by the float or the double - you can't represent 0.01 exactly as a float or double, for example. The string formatting is effectively rounding the result. See my article on .NET floating binary point for more information as well as a class which will let you see the exact value of a double.
I haven't bothered using 100L for result2 because the result would always be the same.
Try
i / 100.0
because i is an int: i / 100 performs integer division, then the result, that is always 0, is casted to the target type. You need to specify at least one non-int literal in your expression:
i / 100.0
Because i is an integer and 100 is an integer...so you have an integer division
Try (decimal)i / 100.0 instead
No matter where you store it, an integer divided by an integer will always be an integer.
You need to force a floating point operation "double / double" instead of an "int / int"
double result = (double)297 / (double)315 ;
this is integer division whatever the type of variable you storing in,
so int / int = int
double result3 = ((double)i) / 100;
Because i is a int value and you divide by an integer so the result is an integer ! and so you need to divide by 100.0 to have an implicit cast in float or specify 100f or 100d
In my case I had only vars and no int
float div = (var1 - var2) / float.Parse(var1.ToString());

Categories