Одна проблема, вероятно, связана с вопросом: где вы исправляете точку?Тип в .NET не может быть параметризован другими аргументами, кроме типов, поэтому FixedNum<18,6>
просто невозможен.И вы не хотите создавать FixedNum1x0
, FixedNum1x1
, FixedNum2x0
, FixedNum2x1
, FixedNum2x2
и т. Д.
Вы должны иметь возможность параметризовать тип вашей фиксированной точки, а не только значенияпотому что это может привести к почти невозможному отслеживанию ошибок:
FixedNum f() { return new FixedNum(1, decimals: 2); }
FixedNum x = new FixedNum(1, decimals: 0);
...
x = f(); // precision of x increased.
Таким образом, вам нужно проверять и ограничивать значения фиксированной точки каждый раз, когда вы получаете их от чего-то, что не является локальной переменной.Как и в случае с decimal
, когда требуется фиксированный масштаб или точность.
Другими словами, учитывая ограничения системы типов .NET, decimal
уже является встроенной реализацией класса FixedNum, описанного выше..