Проблема с десятичным округлением в C # - PullRequest
3 голосов
/ 12 сентября 2011

Все,

У меня есть набор decimal значений в C #.Я записываю их в поля в классе, а затем сериализую этот класс в файл данных XML.Однако у меня есть проблема при попытке округлить значение, которое хранится как ноль или 0, до четырех знаков после запятой.Я хочу, чтобы 0 сохранялось как 0,0000.Возможно ли это с помощью decimal?Конечно, я могу сделать это без проблем при приведении к string, и это не проблема.Я прочитал много тем, но, кажется, ни одна не решает эту проблему.

Любая помощь будет наиболее ценной.Фрагмент кода, который у меня есть:

// directCost (dCost).
decimal dCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.directCost]);
dCost = decimal.Round(dCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.dCost = dCost;

// indirectCost (iCost).
decimal iCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.indirectCost]);
iCost = decimal.Round(iCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.iCost = iCost;

Но это не заставляет от 0 до 0,0000, что является проблемой для необходимого формата файла данных .xml.

Ответы [ 4 ]

7 голосов
/ 12 сентября 2011

Добавьте эту строку в ваш код

dCost *= 1.0000m;

Например:

// directCost (dCost).
decimal dCost = Convert.ToDecimal(EpiCostValues[(int)epiCostField.directCost]);
dCost *= 1.0000m;
dCost = decimal.Round(dCost, 4, MidpointRounding.AwayFromZero);
episodeCostTmp.dCost = dCost;

Надеюсь, это поможет:)

2 голосов
/ 12 сентября 2011

Проблема, с которой вы столкнулись, связана с форматированием значения в виде строки, а не с тем, как оно хранится.Значение хранится в двоичном виде, это та часть, где вы меняете его на строку, которая имеет проблему.Вы можете попробовать: string.Format("{0:0.0000}", iCost);

0 голосов
/ 12 сентября 2011

Я думаю, что при сериализации значения всех полей преобразуются в строку с помощью метода ToString (). возможно, вы могли бы переопределить этот метод в новом типе, который наследует от десятичного или написать метод расширения (хотя не знаю, работает ли он).

0 голосов
/ 12 сентября 2011

Вы не увидите дополнительную точность, пока не отформатируете вывод своего числа.Например, ничто не скажет, что число 1,0000, а не просто 1 или 1,0.Однако, когда число равно 1,2345 - вы увидите этот уровень точности.

Так что вы сделали хорошо.Отформатируйте его до 4 десятичных знаков при записи в файл, и вы получите .0000, когда это целое число, или .2345 (или что бы то ни было), если используется точность.

...