S>Так что я бы оставил в языке понятие number с известным количеством цифр после запятой (и неограниченным — до запятой).
У меня в реализации почти так и сделано. Т.е. сложение/вычитание — не меняют числа знаков после запятой, умножение — даёт сумму знаков после запятой множителей (и потом можно округлить, если очень надо), для деления есть static поле precision, до которого производится деление через operator/(). Если надо разделить точнее или грубее — есть специальные методы. Не помню, сделано или нет, но наверно имеет смысл по дефолту делить с точностью precision+1, и затем округлять последний знак дефолтным способом (вот такого статик поля у меня точно сейчас нет, скорее всего Rounding::math используется, если сделано с округлением последнего знака)