Хранить бесконечные десятичные дроби C # - PullRequest
0 голосов
/ 08 декабря 2011

Мне нужно сделать некоторые вычисления с дробями, в результате которых есть бесконечные десятичные дроби. Например:

240/360=0.666666...

Выходные данные имеют бесконечные десятичные дроби, и когда я умножаю это на целое число, результат должен быть целым числом. Итак, я кодировал так:

result = someInteger * decimal.divide(240/360);

(попробуйте с someInteger = 2700) Но результат имеет десятичные значения, и некоторые калькуляторы или даже электронные таблицы будут выводить целочисленный результат. Как я могу получить такие же результаты в C #?

Спасибо

Ответы [ 4 ]

12 голосов
/ 08 декабря 2011

Выходные данные имеют бесконечные десятичные дроби, и когда я умножаю это на целое число, результатом должно быть целое число.

На самом деле этого не произойдет.

Что вы можете сделать, это осторожное округление (после умножения).

Или вместо

 result = someInteger * decimal.divide(240/360);

вы можете использовать

 result = someInteger * 240 / 360;

в чем проблема?

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

struct Rational 
{
  public readonly int Numerator;
  public readonly int Denominator;

  // lots of members, including operators
}

Есть библиотеки и примеры , как это сделать.

Но учтите, что вы все равно не сможете точно представить π.

1 голос
/ 08 декабря 2011

Вы можете хранить числитель и знаменатель отдельно в виде целых чисел и умножать числитель в первую очередь перед делением, это не решит каждую проблему, хотя 1/3 * 2 все равно будет давать бесконечный десятичный знак.Это также работает только для рациональных чисел.

0 голосов
/ 08 декабря 2011

Многие приложения выполняют псевдофракционную математику, выполняя промежуточные вычисления с более высокой степенью точности, чем то, что в конечном итоге потребуется / выводит пользователь (Office делает это). Если это не то, что вам нужно, и вы хотите выполнять истинную дробную математику, тогда ищите реализацию дробей. Кажется, здесь есть достойная реализация . Проблема с такими реализациями состоит в том, что ответственность за функциональную корректность лежит на эффективности. Таким образом, если вашему приложению необходимо выполнить миллионы операций с дробями, его производительность может снизиться.

0 голосов
/ 08 декабря 2011

использовать Math.Round()

result = someInteger * decimal.divide(240/360);

result = Math.Round(result);

Вернуть целое число - это то, что вы просите сделать правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...