截断十进制数而不是四舍五入

时间:2008-12-01 03:31:54

标签: .net floating-point truncate

  

可能重复:
  c# - How do I round a decimal value to 2 decimal places (for output on a page)

我想截断下面的小数

  • 2.22939393 - > 2.229
  • 2.22977777 - > 2.229

10 个答案:

答案 0 :(得分:59)

您可以使用Math.Round

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

或者您可以将ToString与N3 numeric format一起使用。

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

编辑:由于您不想进行舍入,因此您可以轻松使用Math.Truncate

Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229

答案 1 :(得分:17)

double d = 2.22977777;
d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ;

当然,如果你试图截断舍入错误,这将不起作用,但它应该与你在示例中给出的值一起使用。请参阅this question的前两个答案,了解有时为什么它不起作用的详细信息。

答案 2 :(得分:8)

截断任意小数位数的函数:

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;
}

答案 3 :(得分:7)

这是一个不受整数溢出影响的扩展方法(就像上面的一些答案一样)。它还为一些效率缓存了10个幂。

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 ? Math.Pow(10, precision) : pow10[precision];
    return Math.Truncate(x * m) / m;
}

答案 4 :(得分:3)

这与上面的TcKs建议类似,但是使用math.truncate而不是int转换

VB:但你会明白这个想法

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

答案 5 :(得分:0)

您想要输出什么格式?

如果您对字符串感到满意,请考虑以下C#代码:

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

结果将是“3.12”。

如果您使用.NET,此链接可能会有用。 http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

我希望有所帮助....但除非您确定使用的语言和您希望输出的格式,否则很难提出合适的解决方案。

答案 6 :(得分:0)

也许另一种快速解决方案可能是:

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

答案 7 :(得分:0)

试试这个

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);

答案 8 :(得分:-2)

试试这个:

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

可写得更短,但这更具描述性。

编辑:简短方法:

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

答案 9 :(得分:-3)

忘掉一切只看看这个

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