38

Possible Duplicate:
c# - How do I round a decimal value to 2 decimal places (for output on a page)

I want to truncate the decimals like below

i.e.

  • 2.22939393 -> 2.229
  • 2.22977777 -> 2.229
4
  • Related question: stackoverflow.com/questions/304011/… Commented Dec 1, 2008 at 4:11
  • 1
    I believe the assembly instruction .trn will do this for you as well. Commented Feb 17, 2010 at 1:56
  • 6
    The duplicate question says nothing about rounding off without truncating. While similar, the key aspects of this question (do not round off) is not correctly answered by the "duplicate". Voting to reopen. Commented Jun 1, 2015 at 13:40
  • 1
    This is not a duplicate question. I couldn't posted my solution here, because the question is closed, so I posted it in a similar thread: stackoverflow.com/questions/3143657/… Commented May 17, 2016 at 21:45

10 Answers 10

63

You can use Math.Round:

decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229 

Or you can use ToString with the N3 numeric format.

string roundedNumber = number.ToString("N3"); 

EDIT: Since you don't want rounding, you can easily use Math.Truncate:

Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229 
Sign up to request clarification or add additional context in comments.

3 Comments

Doesn't work with the second example. I just want it truncated - not rounded off.
Just to reiterate: +1 for Math.Truncate, -1 for Math.Round, which doesn't solve the question asked.
Math.Truncate wont work either if you dont multiply and divide it by 1000. Truncate basicly removes the zeros at the end. There is no such a Math.Truncate that takes the number of decimals as a parameter.
17
double d = 2.22977777; d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ; 

Of course, this won't work if you're trying to truncate rounding error, but it should work fine with the values you give in your examples. See the first two answers to this question for details on why it won't work sometimes.

6 Comments

wow all that just to shorten a number.
It looks like a lot, but it's doing a lot less work than converting to a string. :)
Note you'll probably get rounding errors with this.
You shouldn't get any more rounding error than you start with.
I think using decimal data type should be is for universal solution.
|
8

Here's an extension method which does not suffer from integer overflow (like some of the above answers do). It also caches some powers of 10 for efficiency.

readonly static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 }; public static double Truncate(this double x, int precision) { if (precision < 0) throw new ArgumentException(); if (precision == 0) return Math.Truncate(x); double m = precision < pow10.Length ? pow10[precision] : Math.Pow(10, precision); return Math.Truncate(x * m) / m; } 

Comments

7

A function to truncate an arbitrary number of decimals:

public decimal Truncate(decimal number, int digits) { decimal stepper = (decimal)(Math.Pow(10.0, (double)digits)); int temp = (int)(stepper * number); return (decimal)temp / stepper; } 

1 Comment

This fails on large numbers with System.OverflowException: Value was either too large or too small for an Int32
3

This is similar to TcKs suggestion above, but using math.truncate rather than int conversions

VB: but you'll get the idea

Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double dim power as decimal = Math.Pow(10, decimalplaces) return math.truncate(totruncate * power) / power end function 

Comments

0

What format are you wanting the output?

If you're happy with a string then consider the following C# code:

double num = 3.12345; num.ToString("G3"); 

The result will be "3.12".

This link might be of use if you're using .NET. http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

I hope that helps....but unless you identify than language you are using and the format in which you want the output it is difficult to suggest an appropriate solution.

1 Comment

This doesn't help the OP because it rounds the digits, rather than truncating. Also, the precision specifier for the "G" format is for the total number of digits, not just the decimal ones (which is what "F" does)
0

Maybe another quick solution could be:

>>> float("%.1f" % 1.00001) 1.0 >>> float("%.3f" % 1.23001) 1.23 >>> float("%.5f" % 1.23001) 1.23001 

Comments

0

Try this

double d = 2.22912312515; int demention = 3; double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention)) / Math.Pow(10.0, demention); 

Comments

-2

Try this:

decimal original = GetSomeDecimal(); // 22222.22939393 int number1 = (int)original; // contains only integer value of origina number decimal temporary = original - number1; // contains only decimal value of original number int decimalPlaces = GetDecimalPlaces(); // 3 temporary *= (Math.Pow(10, decimalPlaces)); // moves some decimal places to integer temporary = (int)temporary; // removes all decimal places temporary /= (Math.Pow(10, decimalPlaces)); // moves integer back to decimal places decimal result = original + temporary; // add integer and decimal places together 

It can be writen shorter, but this is more descriptive.

EDIT: Short way:

decimal original = GetSomeDecimal(); // 22222.22939393 int decimalPlaces = GetDecimalPlaces(); // 3 decimal result = ((int)original) + (((int)(original * Math.Pow(10, decimalPlaces)) / (Math.Pow(10, decimalPlaces)); 

1 Comment

Might be because it doesn't compile. What language were you developing in? I tried this in C# just now and I get an error for trying to multiply a decimal by a double.
-3

Forget Everything just check out this

double num = 2.22939393; num = Convert.ToDouble(num.ToString("#0.000")); 

1 Comment

This is wrong. The original post is looking to truncate. This will round. 2.2296 will result in 2.23.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.