formatting double precision values in C# - c#

Say I have a double variable initialized as
double dValue = 5.156365
I would like to show this in a textbox as 5.16 i.e only two decimal places.
How should I format?
Is textbox.Text = dValue.ToString("F2", Culture.....) correct? When I tried it did give me the correct result. However, if dValue = 5 then I would like only 5 to be shown and not 5.00.
How could I achieve this in C#?

A 0 in the string forces that decimal place, while a # lets the number get up to that decimal place.
dValue.ToString("0.##")

Related

How to add precision to decimal value

I want to add precision to the decimal value. For example, I have this value:
decimal number = 10;
I want to make it 10.00. I don't want to convert it to string like number.ToString("#.00")
Currently, I have this method:
decimal CalculatePrecision(decimal value, int precision)
{
var storedCalculated = decimal.Divide(1, Convert.ToDecimal(Math.Pow(10, precision)));
return value + storedCalculated - storedCalculated;
}
Is there any good solution for this?
You can't. 10 and 10.00 are the same number. Only the "presentation" is different. Both "presentations" are strings. The actual number look different. If you need to change the presentation, convert to string.
How about
decimal d = 10;
d += 0.00M;
Console.WriteLine(d);
Try reference
Math.Round not keeping the trailing zero
How do I display a decimal value to 2 decimal places?

Double value get rounded while converting to string after entering 14th digit before decimal point [duplicate]

This question already has answers here:
Why Is ToString() Rounding My Double Value?
(6 answers)
Closed 5 years ago.
I am using large double value as like below code
double value = 99999999999999.99;
this.textBox1.Text = value.ToString("N");
But the TextBox value gets rounded off and I get the below value in TextBox
100,000,000,000,000.00
Can anyone tell me how can I get the exact value without rounded off?
It's because double precision is 15-16 digits (https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/double) and your number consists of too many digits for it.
I would suggest to use decimal type instead for such numbers like this:
decimal value = 99999999999999.99M;
M suffix makes the number of type decimal instead of double.
Well you ran out of the precision of a double datatype. Try using decimal instead:
decimal value = 99999999999999.99M;
this.textBox1.Text = value.ToString("N");
gives
99.999.999.999.999,99

I want to display 13.00 rather than 13

now I have 3 textboxes that the user can type in them his degrees and the average will be calculated and displayed in another textbox! I've made the result to show just two fractional digits by calling the Math.Round() Method
This is my code:
double Sum = int.Parse(textBox1.Text) + int.Parse(textBox2.Text) + int.Parse(textBox3.Text);
double Avg = Sum / 3;
textBox4.Text = Math.Round(Avg, 2).ToString();
My problem is whenever the average is equal to an integer number like 20, I want it to display 20.00
Since C# 6.0 you can use string interpolation to format variables into a string (in this case, format the number with two decimal places):
$"{Avg:.00}"
Alternatively, use string#Format:
string.Format("{0:.00}", Avg);
If you don't want to use either of those, you can use the ToString function with this parameter for that as mentioned in the comments:
Avg.ToString("0.00")

Double type strange behavior while concatenating with String or Converting to String

I have logging functionality in project which compares objects value and displays differences but i have a scenarion i have latitude and longitude values in double data type but when i concatenate it with string or convert it to string i am getting strange behaviour as it is showing the same value in both variables which is totally not understandable how it is happening.
Here is the code:
double value1 = -6.2845230102539063;
double value2 = -6.2845230102539098;
if (!object.Equals(value1, value2))
{
var result = value2 + " to " + value1;
Console.WriteLine(result);
}
Console.ReadLine();
Expected Output :
-6.2845230102539098 to -6.2845230102539063
Actual Output :
-6.28452301025391 to -6.28452301025391
Here is DEMO FIDDLE:
https://dotnetfiddle.net/0XM3Da
What is happening here?
From MSDN: http://msdn.microsoft.com/en-us/library/678hzkk9.aspx
Double has a precision of 15-16 digits. You've exceeded that limit. You should use Decimal instead. See here for details: Can C# store more precise data than doubles?
This is addressed in #LukeH's answer to "Formatting doubles for output in C#":
The problem is that .NET will always round a double to 15 significant
decimal digits before applying your formatting, regardless of the
precision requested by your format and regardless of the exact decimal
value of the binary number.
Using the DoubleConverter class linked to in that answer, we get
var x = -6.2845230102539063;
var y = -6.2845230102539098;
Console.WriteLine(x == y);
Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(DoubleConverter.ToExactString(x));
Console.WriteLine(DoubleConverter.ToExactString(y));
which prints
False
-6.28452301025391
-6.28452301025391
-6.28452301025390625
-6.284523010253909802713678800500929355621337890625
Or you can use the G17 format specification
Console.WriteLine(x.ToString("G17"));
Console.WriteLine(y.ToString("G17"));
which will give you
-6.2845230102539063
-6.2845230102539098
From: http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx
'By default, the return value only contains 15 digits of precision although a maximum of 17 digits is maintained internally.'
So it knows that they are not the same size, but doesn't display them that way.
A Double value has up to 15 decimal digits of precision, you can refer to detail explanation http://msdn.microsoft.com/zh-cn/library/system.double(v=vs.110).aspx
Have you tried the decimal data type. It gives you an exact representation of numbers...for banking and stock markets I suppose. And you could reduce the mantissa to a certain length (perhaps 18).

How to get floats value without including exponential notation

In C#, is it possible to perform ToString on a float and get the value without using exponentials?
For example, consider the following:
float dummy;
dummy = 0.000006F;
Console.WriteLine(dummy.ToString());
This gives the output
6E-06
However, what I was is
0.000006
The closest I could find was using the "F" qualifier, however I then need to specify the number of decimal places otherwise the value get rounded.
Is there actually a way of doing this automatically or do I need to do a load of funky logic to either trim zeroes or figure out the number of required decimals.
Thanks;
Richard Moss
Try this
Console.WriteLine(dummy.ToString("F"));
You can also specify number of decimal places. For example F5, F3, etc.
Also, you can check custom format specifier
Console.WriteLine(dummy.ToString("0.#########"));
string dum = string.Format("{0:f99}",dummy).TrimEnd('0');
if (dum.EndsWith(",")) dum = dum.Remove(dum.Length - 1);
Without some further background info, it's hard to tell - but it sounds like you want decimal semantics. So why not use the decimal type instead?
decimal dummy;
dummy = 0.000006M;
The decimal type is more accurate at representing decimal numbers than float or double, but it is not as performant. See here for more info.
Console.WriteLine(dummy.ToString("N5"));
where 5 its number of decimal places
float dummy = 0.000006F;
Console.WriteLine(dummy.ToString("0." + new string('#', 60)));
If you'll be doing this a lot then it makes sense to store the format string in a static field/property somewhere and re-use it, rather than constructing a new string every time:
private static readonly string _allFloatDigits = "0." + new string('#', 60);
// ...
float dummy = 0.000006F;
Console.WriteLine(dummy.ToString(_allFloatDigits));

Categories