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

Pha*_*oda 36 .net floating-point truncate

可能重复:
c# - 如何将十进制值舍入到2个小数位(用于页面上的输出)

我想截断小数,如下所示

  • 2.22939393 - > 2.229
  • 2.22977777 - > 2.229

CMS*_*CMS 60

你可以使用Math.Round:

decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229
Run Code Online (Sandbox Code Playgroud)

或者您可以使用带有N3 数字格式的 ToString .

string roundedNumber = number.ToString("N3");
Run Code Online (Sandbox Code Playgroud)

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

Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229
Run Code Online (Sandbox Code Playgroud)

  • Math.Truncate为+1 (4认同)
  • 重申一下:Math.Truncate + 1,Math.Round -1,这不能解决所问的问题。 (2认同)

Bil*_*ard 17

double d = 2.22977777;
d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ;
Run Code Online (Sandbox Code Playgroud)

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

  • 哇所有这些只是为了缩短一个数字. (2认同)

Car*_*erg 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这在大量数字上失败,`System.OverflowException: Value is too large or too small for an Int32` (2认同)

Gle*_*den 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;
}
Run Code Online (Sandbox Code Playgroud)