Округление: различия между версиями
Внешний вид
Sidminik (обсуждение | вклад) Нет описания правки |
Sidminik (обсуждение | вклад) |
||
| Строка 79: | Строка 79: | ||
return Rounding.RoundBase(firstNum, 2, 1) + " (" + Rounding.RoundBase(secondNum, 0, 1) + ")"; | return Rounding.RoundBase(firstNum, 2, 1) + " (" + Rounding.RoundBase(secondNum, 0, 1) + ")"; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Подключение== | |||
==Код функции== | ==Код функции== | ||
Текущая версия от 08:44, 20 октября 2026
Функция Rounding.RoundBase() - предназначена для гибкого округления числовых значений.
В отличие от стандартных функций - поддерживает работу с отрицательными разрядами и округление до значащих цифр.
Входные параметры
value(Double) - исходное число для обработки;digits(Object)- при
Mode = 1- количество знаков после запятой (положительное) или до запятой (отрицательное); - при
Mode = 0- количество значащих цифр;
- при
mode(Object) - режим работы:1(ToDecimalPlace) - десятичное округление;0(ToSignificantPlace) - значащие цифры.
Выходные параметры
String- возвращает строковое представление числа.
Алгоритм
Функция работает по методу Away From Zero (округление от нуля).
Режим 1 (десятичное округление):
- вычисляется множитель;
- число умножается на множитель, округляется до целого и делится обратно;
- при положительном n результат форматируется с фиксированным количеством нулей после запятой.
Режим 0 (значащие цифры):
- определяется порядок числа через десятичный логарифм;
- вычисляется масштабный коэффициент, чтобы оставить ровно
nцифр; - число масштабируется, округляется и возвращается в исходный порядок;
- результат преобразуется в компактную строку (удаляются лишние нули в конце).
Использование в выражениях
Принципы использования:
| Исходное значение | Синтаксис в соответствии с формулой | Результат |
|---|---|---|
| 12345 | [Rounding.RoundBase([DataBase.field], 2, 1)]
|
12345,00 |
| 12345.00 | [Rounding.RoundBase([DataBase.field], 0, 1)]
|
12345 |
| 12345.01 | [Rounding.RoundBase([DataBase.field], -2, 1)]
|
12300 |
| 555.55 | [Rounding.RoundBase([DataBase.field], 1, 0)]
|
600 |
Примеры:
// A_2
[Rounding.RoundBase(ToDouble([Main.table_size]) / 1000, 0, 1)]
// R_3
[ResultOrDash(Rounding.RoundBase(First([Main.min_avg]), 2, 1))]
Использование во вкладке кода
// NG_2
string result = Rounding.RoundBase(normDouble, scaleInt, 1);
// NG_2
finalResult4 = Rounding.RoundBase(storage.Results[0], 2, 1);
// NG_2
return Rounding.RoundBase(firstNum, 2, 1) + " (" + Rounding.RoundBase(secondNum, 0, 1) + ")";
Подключение
Код функции
/// <summary>
/// В отличие от стандартных функций, поддерживает работу с отрицательными разрядами и округление до значащих цифр.
/// </summary>
/// <param name="value">Исходное число для обработки;</param>
/// <param name="digits">
/// - при Mode = 1 - количество знаков после запятой (положительное) или до запятой (отрицательное);<br/>
/// - при Mode = 0 - количество значащих цифр;
/// </param>
/// <param name="mode">
/// — <see cref="RoundMode.ToDecimalPlace"/> — десятичное округление;<br/>
/// — <see cref="RoundMode.ToSignificantPlace"/> — значащие цифры
/// </param>
/// <returns>Строковое представление числа, округленного по заданным параметрам</returns>
/// <exception cref="ArgumentOutOfRangeException"></exception>
public static string RoundBase(double value, int digits, RoundMode mode)
{
if (value == 0)
return "0";
double result;
switch (mode)
{
case RoundMode.ToDecimalPlace:
double factor = Math.Pow(10, digits);
result = Math.Round(value * factor, 0, MidpointRounding.AwayFromZero) / factor;
return result.ToString("F" + Math.Max(0, digits));
case RoundMode.ToSignificantPlace:
double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(value))) + 1 - digits);
result = Math.Round(value / scale, 0, MidpointRounding.AwayFromZero) * scale;
return result.ToString("G");
default:
throw new ArgumentOutOfRangeException(nameof(mode), Localization.InvalidRoundMode);
}
}
/// <summary>
/// Режим округления.
/// </summary>
public enum RoundMode
{
ToSignificantPlace = 0,
ToDecimalPlace = 1
}