Округление: меньше килограмма до сотых, больше — до десятых

В форматировании спецификации мы можем указать, с какой точностью выводить значение.

Вот только небольшие значения лучше выводить с округлением до сотых, а большие — с округлением до десятых. Такое обычно надо в спецификации арматуры.
Как сделать такое в Ревите?
Самый простоq способ сделать округление чисел в спецификациях — настроить «Форматирование»:
Но я обычно с осторожностью его использую, т.к. Ревит сначала складывает неокругленные значения, а затем округляет сумму, поэтому начинаются претензии «ентот ваш ревит неточно считает, я вот калькулятором цифры сложил и не сходится».
Ну и такое округление фиксированное, а мне надо на разное число знаков.
Поэтому мы создадим расчетный параметр, который будет округлять значения при помощи формулы.

1. Расчетные параметры для подсчета массы

Для подсчета массы создадим параметр «МассаПогМетра» типа «число», с формулой
МассаПогМетра = 3.1416 * 7.86 * ((Диаметр стержня / 2 мм) ^ 2) / 1000
Определяем площадь поперечного сечения и умножаем на плотность стали — получаем массу единицы длины.
Затем создадим параметр «МассаСтержня» типа «Длина», определим массу, пока без округления:
МассаСтержня = МассаПогМетра * Длина стержня
Вот только получается что-то не то — масса в граммах:
Оно и понятно, массу мы посчитали на погонный метр, а длина — в миллиметрах. Надо еще разделить на 1000 мм:
МассаСтержня = МассаПогМетра * Длина стержня / 1000 мм
Сделаем пока в «Форматировании» округление до двух знаков и перейдем ко второй части

2. Работа с округлением при помощи формул

Добрались до самого интересного.
В чем идея округления? В формулах Ревита есть оператор round(x). Он округляет число до ближайшего целого. Для того, чтобы получить округление до десятых, нужно использовать
0.1*round(x*10)
0.1*round(6.5785*10) = 0.1*round(65.785) = 0.1*66 = 6.6
До сотых, соответственно, 0.01*round(x*100).
Есть еще одна проблема — round() работает только с безразмерными единицами — типа «Число». Длину-массу-площадь он не округляет, и оно понятно — ведь неизвестно, до каких единиц надо округлять. Мы воспользуемся возможностью перевода единиц в формулах:
ПараметрДлина/1мм = ПараметрЧисло
68мм / 1мм = 68мм / 1мм = 68
Понятно — миллиметры сокращаются, остается голое число. Если надо опять получить длину — можно умножить на 1мм. С «Безразмерными» значениями округление уже работает нормально.
Пробуем — создаем расчетный параметр «МассаСтержняОкругл» и пишем формулу, используя оператор if (вместо умножения на 10 использую деление на 0.1, чтобы сразу и от миллиметров избавиться):
МассаСтержняОкругл = if(МассаСтержня < 1, 0.01 мм * round(МассаСтержня * 10 /), 0,1 мм * round(МассаСтержня / 0.1 мм))
 
Но вот что получилось:
Где мы ошиблись?
 
Откроем снова окно формулы, вот что видим:
 
Ревиту не понравилось число «0.01 мм» и он округлил его до нуля. А ещё  почему-то масса стержня вычисляется в миллиметрах…

3. Использование в расчетах параметра «Число»

Вместо того, чтобы бодаться с настройками единиц, бывает удобно работать с параметром типа «Число». Это очень простой параметр, не имеющий размерности, имеющий максимальную точность и без сюрпризов вроде автоматического округления «0.01» до «0».
К «числу» можно привести любой параметр, если разделить его на нужную единицу измерения, как мы делали для round(). Настоятельно рекомендую не давать Ревиту самостоятельно заниматься округлением и работой с единицами измерения, и использовать только параметр «длина», «целое», «площадь», а все остальное — массы, плотности, да что угодно, — делать «Числом».
Итак, удалим параметр «МассаСтержня» и создадим новый, типа «Число». Формула для него:
МассаСтержня = МассаПогМетра * Длина стержня / 1000мм
 Обратите внимание на «мм» в конце формулы — делим «длину» на миллиметры, получаем «число».
Также удалим параметр «МассаСтержняОкругл» и создадим такой же, типа «Число». Формула:
МассаСтержняОкругл = if(МассаСтержня < 1, 0,01 * round(МассаСтержня * 100), 0,1 * round(МассаСтержня * 10))
Ну и результат:
Удачи!