2015-09-12 3 views
0

Я просмотрел большое количество вопросов и ответов около math.round /.floor/.truncate/.ceiling, но не смог найти ответ на мою проблему rounding (with currency values).Как убедиться, что округление числа с плавающей запятой выполняется только в первой дополнительной десятичной позиции?

Я понимаю math.round/toeven/awayfromzero, но это не похоже на это.

(в приведенных ниже примерах 1.88 просто любое число ап может быть заменен любым другим значением n.mm)

Если результат расчета "decimal/decimal" является 1.88499 мне нужно 1.88 как закругленным результата. Если расчет дает 1.885499, я хочу 1,89 в результате rounding (always rounding to two decimal digits).

Теперь math.round(1.88499999,2) Возвращает 1.89 хотя 0.00499999 конечно НИЖЕ посередине между 8 и 9. Я понимаю, что если число округляется с последними десятичными цифрами до первого, результат понятен:

1.88499999 -> 1.8849999 -> 1.884999 -> 1.88499 -> 1.8849 -> 1.885 -> 1.89 

Однако с финансовой точки зрения, как для расчетов по НДС, что не помогает вообще.

Единственный способ, который я могу придумать, - это сократить число сначала за третьей десятичной цифрой, чтобы округлить его до 2 обязательных цифр. Но разве нет более элегантного способа?

+0

Math.Round (1.88499999,2) возвращает 1,88 – dotctor

+0

Как правило, вы не должны использовать float или double для любых вычислений, связанных с деньгами на любом языке программирования (из-за способа float и double work, они являются неточными), есть библиотеки, специально предназначенные для обработки такой операции. попробуйте найти их. Вам нужна библиотека с фиксированной точкой арифметики (которая имеет функции для обработки валюты) – x4rf41

+0

Вы случайно используете float? что объясняло бы, почему '1.88499999' округляет до 1.89' – x4rf41

ответ

0

вы можете использовать Decimal.ToString(),

попробовать,

decimal dec = 1.88499999m; 

dec = Convert.ToDecimal(dec.ToString("#.00")); 
0

Я решил проблему, избегая поплавка типа данных в случае.

Я использовал целочисленные переменные и умножил все значения валюты на 100. Таким образом, вычисления не зависят от округления или, скорее, округлены правильно, когда результат вычисления установлен в целое.