Подтвердить что ты не робот

Сократить десятичное число, не округленное

Возможный дубликат:
С# - Как округлить десятичное значение до двух знаков после запятой (для вывода на странице)

Я хочу усечь десятичные числа, как показано ниже

то есть.

  • 2.22939393 → 2.229
  • 2.22977777 → 2.229
4b9b3361

Ответ 1

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

Конечно, это не сработает, если вы пытаетесь обрезать ошибку округления, но он должен отлично работать со значениями, которые вы даете в своих примерах. См. Первые два ответа на этот вопрос, чтобы узнать, почему он не будет работать иногда.

Ответ 2

Вы можете использовать Math.Round:

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

Или вы можете использовать ToString с цифровым форматом N3 .

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

EDIT:. Поскольку вы не хотите округлять, вы можете легко использовать Math.Truncate:

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

Ответ 3

Функция усечения произвольного числа десятичных знаков:

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

Ответ 4

Здесь используется метод расширения, который не страдает от переполнения целых чисел (например, некоторые из приведенных выше ответов). Он также обеспечивает кэширование производительности в 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;
}

Ответ 5

Это похоже на предложение 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

Ответ 6

Какой формат вы хотите получить?

Если вы довольны строкой, рассмотрите следующий код С#:

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

Результат будет "3.12".

Эта ссылка может быть полезна, если вы используете .NET. http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Надеюсь, что это поможет... но если вы не определяете язык, который вы используете, а формат, в котором вы хотите получить результат, сложно предложить подходящее решение.

Ответ 7

Возможно, еще одно быстрое решение:

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

Ответ 8

Попробуйте это

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

Ответ 9

Попробуйте следующее:

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

Ответ 10

Забудьте все, просто проверьте это

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