C# Remove all preceding zeros from a double (no strings) [closed] - c#

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 months ago.
This post was edited and submitted for review 6 months ago and failed to reopen the post:
Original close reason(s) were not resolved
Improve this question
I need a method to return the firsts non zero numbers from a double in the following way: Any number >= 1 or == 0 will return the same; All the rest will return as per the following examples:
(Please note that I am using double because the potential imprecision is irrelevant in the use case whereas saving memory is relevant).
double NumberA = 123.2; // Returns 123.2
double NumberB = 1.2; // Returns 1.2
double NumberC = 0.000034; // Returns 3.4
double NumberD = 0.3; // Returns 3.0
double NumberE = -0.00000087; // Returns -8.7

One option would be to iteratively multiply by 10 until you get a number greater than 1:
public double RemoveLeadingZeros(double num)
{
if (num == 0) return 0;
while(Math.Abs(num) < 1) { num *= 10};
return num;
}
a more direct, but less intuitive, way using logarithms:
public double RemoveLeadingZeros(double num)
{
if (num == 0) return 0;
if (Math.Abs(num) < 1) {
double pow = Math.Floor(Math.Log10(num));
double scale = Math.Pow(10, -pow);
num = num * scale;
}
return num;
}
it's the same idea, but multiplying by a power of 10 rather then multiplying several times.
Note that double arithmetic is not always precise; you may end up with something like 3.40000000001 or 3.3999999999. If you want consistent decimal representation then you can use decimal instead, or string manipulation.

I would start with converting to a string. Something like this:
string doubleString = NumberC.ToString();
I don't know exactly what this will output, you will have to check. But if for example it is "0.000034" you can easily manipulate the string to meet your needs.

Related

C# loop on fraction [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 4 years ago.
Improve this question
I need someone to give me an idea on how to go on about this problem.Using a loop to calculate the fraction , There is no common value.I want to get the sum
Eg for fraction :
1 1/5 1/10 1/15 1/20 … 1/290 1/295 1/300
code snippet:-
int sum=0;
for(int i=1;i<=60 ;i++)
{
int sum=1
}
These sort of problems are actually surprisingly non-trivial due to issues with working with floating point, and decimal types for that matter.
Accepting that you want a loop solution for this (a closed form solution for n terms does exist), first note that your series can be written as
1 + 1/5(1 + 1/2 + 1/3 + ... + 1/60)
Then note that a good rule of thumb when working with floating point types is to add the small terms first.
So an algorithm would be of the form
double sum = 0.0;
for (int i = 60; i >= 1; --i){
sum += 1.0 / i;
}
sum = sum / 5 + 1;
Note the 1.0 in the numerator; that's there to defeat integer division.
Reference: Is floating point math broken?
͏Since you asked for a hint:
float sum = 1.0;
for (int i = 5; i <= ??; i += ??) {
sum += 1.0/i;
}
What goes in place of the ??s?
try this code:
double sum=1;
for(int i=5; i<=300; i+=5)
sum += (double) 1 / i;
The value of sum will be 1.93597408259035

Find Double/Float value is Odd or Even in C# [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 5 years ago.
Improve this question
How to find if double value is even or odd without converting them to int in C#? E.g.
123.0d - odd
456.0d - even
3.1415926d - floating point (neither odd nor even)
Try modulo % operator:
double x = 123;
string result = x % 2 == 0
? "even" : x % 2 == 1 || x % 2 == -1
? "odd"
: "floating point"; // e.g. 123.456789
Edit: When does it work? Floating point value (single, double) when it doesn't contain exponential part represents the (integer) value exactly.
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
So we have that the solution will work whenever x in these ranges
[-2**24..2**24] == [-16777216..16777216] (float)
[-2**52..2**52] == [-4503599627370496..4503599627370496] (double)
Please, notice, that since .Net assumes that negative % positive == nonpostive, e.g. -3 % 2 == -1 we have to check x % 2 == -1 as well as x % 2 == 1
well i think you answered your question by your own but here is a short code i wrote:
static void Main(string[] args)
{
double number=10.0;
if(number%2==0)
{
Console.WriteLine("Your number is even!");
}
else
{
Console.WriteLine("Your number is odd!");
}
Console.ReadLine();
}
this way you see really good if it works or not
public static bool IsEven(double x)
{
return x % 2 == 0;
}
Please note that it takes more code to make a helper method that does this than it does to actually do it, so if you ever put this in a production environment expect your QA team to send you nasty e-mails.
public bool isEven(double value)
{
decimal decVal = System.Convert.ToDecimal(value);
if (decVal % 2.0 == 0)
{
return true;
}
else
{
return false;
}
}
EDIT: if you convert to a decimal first it should work.

convert string degrees into decimal units [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
Given a string "3°5'2''" I need to convert it to a decimal representation.
The first step, obviously, is to convert your string notation to degrees, minutes, and seconds. That's simple string-parsing, so I'll leave that as an exercise.
Let's say you're going to use a Tuple for this (http://msdn.microsoft.com/en-us/library/system.tuple.aspx).
public static double GetDegreesFromDMS(Tuple<double,double,double> dms)
{
// First, calculate total seconds.
double seconds = (dms.Item2 * 60) + dms.Item3;
// This makes the fraction of a degree this number / 3600
return dms.Item1 + (seconds / 3600);
}
To call this, you would construct a Tuple with the DMS values like so:
var dms = new Tuple<double, double, double>(3, 5, 2);
var degrees = GetDegreesFromDMS(dms);
Good luck.
For the math portion, I will use the answer from https://stackoverflow.com/a/3249890/1783619 You could of course write your own implementation. I would create my own "Degree" class that looks like this:
public class Degree
{
int degrees;
int minutes;
int seconds;
public static Degree Parse(string input)
{
//Implementation below
}
public decimal ToDecimal()
{
// From https://stackoverflow.com/a/3249890/1783619
// Modified to use floating point division since my inputs are ints.
//Decimal degrees =
// whole number of degrees,
// plus minutes divided by 60,
// plus seconds divided by 3600
return degrees + (minutes/60f) + (seconds/3600f);
}
}
In the parse function, I would split the string based on the well known delimiters and assign the class members based on the split string. Note that this function isn't very safe for bad input as is:
public static Degree Parse(string input)
{
Degree parsedDegree = new Degree();
string[] seperatedStrings = input.Split(new char[] {'°', '\''});
parsedDegree.degrees = seperatedStrings[0];
parsedDegree.minutes = seperatedStrings[1];
parsedDegree.seconds = seperatedStrings[2];
return parsedDegree;
}
To use it:
Degree myDegree = Degree.Parse("3°5'2''");
Decimal myDecimal = myDegree.ToDecimal();

Algorithm: how many indivisible units are needed to overshadow a random number? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
How can I find how many indivisible units of 1,000 are needed to overshadow a random number?
For example, for random number 5,123 I'm going to need 6 x 1,000 to overshadow it, so: MyAlgorithm(5123, 1000) = 6
Edit1: I am sorry if despite my endeavor to articulate my problem into a meaningful description my dyslexia took over, I hope this edit makes it a bit more comprehensible.
Well, if I understand your question, it sounds like you could simply convert the parameters to decimals, divide, then use Math.Ceiling:
int output = (int)Math.Ceiling((decimal)5123 / (decimal)1000); // 6
Alternatively, you could avoid the conversions and rely purely on integer division and the % operator (modulus), like this:
int output = (5123 / 1000) + (5123 % 1000 == 0 ? 0 : 1);
If you want this in a method simply wrap it up like this:
static int MyAlgorithm(int a, int b)
{
return (a / b) + (a % b == 0 ? 0 : 1);
}
if I've understood you correctly, this is really just a one-liner:
public static int MyAlgorithm(int input, int units)
{
return input%units == 0 ? input/units : input/units + 1;
}
the only case when it isn't simply the result of input/units + 1 is the case when there is no remainder
public int MyAlgorithm(int x, int y)
{
int result = x / y;
return (result < 0) ? (result - 1): (result + 1);
}

Auto adjust decimal depending on length [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 9 years ago.
Improve this question
I would like to create a function that can set the decimal length based on the length of the whole number.
Lets say I have these numbers:
100.12345
10.123456
1.1234567
The total length of the whole number should be 5, and the decimal separator should be adjusted so it fits 5 numbers. This is my desired output:
100.12
10.123
1.1234
Is there any easy way to accomplish this in C#?
UPDATE: To be more clear in my question on how the conversion should be.
(Current number > Formatted number)
100000.222 > 100000
10.222222 > 10.222
1.22 > 1.22
1 > 1
0.2222 > 0.2222
Not sure that this is a good answer, but it seems to work
decimal FormatToMaxLength(decimal v, int maxLength)
{
string s = string.Format("{0}", v);
if(s.Length > maxLength + 1)
s = s.Substring(0, maxLength + 1);
decimal cv;
decimal.TryParse(s, out cv);
return cv;
}
a revised version that, if the decimal has more numbers in the whole part than requested length preserve the whole part
decimal FormatToMaxLength(decimal v, int maxLength)
{
string s = string.Format("{0}", v);
string[] parts = s.Split(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]);
if(parts[0].Length >= maxLength)
s = parts[0];
else
s = s.Substring(0, Math.Min(s.Length, maxLength + 1));
decimal cv;
decimal.TryParse(s, out cv);
return cv;
}
Examples tested
decimal d = FormatToMaxLength(121.12233m, 5); // returns 121.12
decimal z = FormatToMaxLength(123456789.12345m, 5); // returns 123456789
Still I am not convinced that converting to a string and then take a subset is a good idea.
Let's see if someone has a better approach or see an obvious solution that I am missing.
static string FormatToMaxLength(decimal d, int maxLength)
{
string s = d.ToString();
s = s.Remove(s.Length - (s.Length - maxLength + 1), s.Length - maxLength - 1);
return s;
}
this seems to work as well

Categories

Resources