2014-01-24 10 views
-4

Я пытаюсь выяснить, какой лучший способ проанализировать десятичное значение. В настоящее время я использую Math.Round, но это не работает для входных данных.Усечение десятичного числа до десятичной цифры

Я хочу, чтобы получить целочисленную часть, а затем первую цифру после десятичной дроби.

var value = 25.987817685360218441503885773M; 
return Math.Round(value, 1); 

возвращается 26, но я хотел бы вернуться 25.9.

+7

Вы уверены, что хотите округлить '25.987817685360218441503885773M' до' 26.9'? Это не так, как работает округление. – ekad

+4

Вы хотите сказать 25.9? Кроме того, что вы ожидаете от 25.887 до раунда? В принципе, вы просто хотите усечь то, что есть после первого десятичного знака, или вам нужны специальные случаи при округлении до следующего целого числа? –

+2

Документация: http://msdn.microsoft.com/en-us/library/System.Math.Round(v=vs.110).aspx –

ответ

3

Предполагая, что вы хотите «округлить» его до 25,9, а не до 26,9, вам нужно сделать это вручную.

var number = 25.9877; 
var rounded = Convert.ToDouble(Convert.ToInt32(number*10))/10; 

И, конечно, это не округление, это просто измельчение десятичных знаков.

+1

@Robert - Если это принятый ответ, и вы действительно действительно означали' 25.9', а не '26.9', то отредактируйте ваше сообщение, чтобы это отразить. – mbeckish

+0

люди меняют мои результаты, я имею в виду 25.9 – Robert

+0

Этот раунд до '26'? 'Convert.ToInt32' раундов. – flindeberg

0

Вы округляете до первого десятичного знака, но 25,98 раундов вверх. Который означает, что 8 = 5 и делает 9 равным 0 и переносит один на 5, т. Е. 5 + 1. Таким образом, вы получаете 26.

1

Вы округляете, что, очевидно, будет округлено в конце. То, что вы хотите сделать, - обрезать число. Вот метод, который будет выполнять то, что вы хотите:

public decimal TruncateDecimal(decimal value, int precision) 
{ 
    decimal step = (decimal)Math.Pow(10, precision); 
    int tmp = (int)Math.Truncate(step * value); 
    return tmp/step; 
} 
2

Edit:

Math.Round имеет перегрузку, что:

System.Math.Round (n, 2, MidpointRounding.ToEven); 

Посмотреть Math.Round Method

0

Поскольку по крайней мере, Насколько мне известно, здесь нет рабочего решения, которое делает то, что хочет OP.

// .NET has no build in power function for decimals 
decimal Pow(decimal value, int exp) 
{ 
if (exp < 0) 
    return 1/Pow(value, -exp); 

if (exp == 0) 
    return 1; 
else if (exp % 2 == 0) 
    return Pow(value * value, exp/2); 
else return 
    value * Pow(value, exp - 1); 
} 
// Rounds a number to decimals decimals, ie 1 => 1 decimal, -2 => whole hundreds 
public decimal Truncate(decimal number, int decimals) 
{ 
var factor = 1/Pow(10, decimals); 
return number - (number % factor); 
} 

Имейте в виду, что это не округление, это какая-то странная форма усечения.

Смежные вопросы