Как работать с дробными числами (одновременно десятичные, сотые, тысячные и целые)?

Vero

Client
Регистрация
22.11.2019
Сообщения
33
Благодарностей
4
Баллы
8
Коллеги, столкнулся с такой задачей: нужно выявить к какому разряду принадлежит число и прибавить 2 пункта к этому числу в зависимости от его разряда.

Например число: 1.2244 - нужно прибавить 0.0002 (грубо говоря к последней цифре прибавить 2)

Еще примеры (везде +2):

25.92 = 25.94
2.59 = 2.61
0.021 = 0.023
3.3 = 3.5
48 = 50
0.8643 = 0.8645
итд
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 764
Благодарностей
2 407
Баллы
113
Пример может быть таким, но следует учитывать, что если число заканчивается на 0 - увеличено на коррекцию будет предыдущий не нулевой разряд.

C#:
decimal[] numbers = new[]{
    1.2244m,  25.92m,   2.59m,   0.021m,
    3.3m,   48m,  0.8643m
};
int correction = 3; // тут указываем число которое добавить от 1 до 9. 

foreach (decimal input_number in numbers) {
    decimal number = input_number;
    int pow = 0;
    while (number != Math.Truncate(number)) {
        number *= 10;
        pow++;
    }
    
    decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
    project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);
}
119425
 
  • Спасибо
Реакции: Vero

Vero

Client
Регистрация
22.11.2019
Сообщения
33
Благодарностей
4
Баллы
8
Пример может быть таким, но следует учитывать, что если число заканчивается на 0 - увеличено на коррекцию будет предыдущий не нулевой разряд.

C#:
decimal[] numbers = new[]{
    1.2244m,  25.92m,   2.59m,   0.021m,
    3.3m,   48m,  0.8643m
};
int correction = 3; // тут указываем число которое добавить от 1 до 9.

foreach (decimal input_number in numbers) {
    decimal number = input_number;
    int pow = 0;
    while (number != Math.Truncate(number)) {
        number *= 10;
        pow++;
    }

    decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
    project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);
}
Посмотреть вложение 119425
Ох, спасибо! Я уже колхозить регулярками начал) Есть 2 вопроса:

1. Можно ли как-то учитывать нулевое значение в конце?
2. И как прописать значение одного числа, если оно переменная? Имеется ввиду, если число 21.9923 находится в переменной 'num' - то как в вашем примере это отразить? не дружу с С#, к сожалению...
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 764
Благодарностей
2 407
Баллы
113
2. И как прописать значение одного числа, если оно переменная?
Имеется ввиду, если число 21.9923 находится в переменной 'num' - то как в вашем примере это отразить?
Вот так, если 21.9923 хранится в переменной num.
Разделитель точка заменяю на разделитель запятая.
C#:
int correction = 2;
decimal input_number = decimal.Parse(project.Variables["num"].Value.Trim().Replace(".",","));

decimal number = input_number;
int pow = 0;
while (number != Math.Truncate(number)) {
    number *= 10;
    pow++;
}

decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);
1. Можно ли как-то учитывать нулевое значение в конце?
Чтобы учитывать 0 можно использовать примерно такой вариант:

C#:
int correction = 2;
decimal input_number = decimal.Parse(project.Variables["num"].Value.Trim().Replace(".",","));

string[] items = input_number.ToString().Split(','); // вот так иногда всплывают артефакты несколько лишних разрядов появляется
// string[] items = project.Variables["num"].Value.Trim().Replace(".",",").Split(','); // или так, если появлятся проблемы с округлениями

int pow = 0;
if(items.Length == 2) pow = items.Last().Length;

decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);
 
Последнее редактирование:
  • Спасибо
Реакции: Vero

Vero

Client
Регистрация
22.11.2019
Сообщения
33
Благодарностей
4
Баллы
8
Вот так, если 21.9923 хранится в переменной num.
Разделитель точка заменяю на разделитель запятая.
C#:
int correction = 2;
decimal input_number = decimal.Parse(project.Variables["num"].Value.Trim().Replace(".",","));

decimal number = input_number;
int pow = 0;
while (number != Math.Truncate(number)) {
    number *= 10;
    pow++;
}

decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);

Чтобы учитывать 0 можно использовать примерно такой вариант:

C#:
int correction = 2;
decimal input_number = decimal.Parse(project.Variables["num"].Value.Trim().Replace(".",","));

string[] items = input_number.ToString().Split(','); // вот так иногда всплывают артефакты несколько лишних разрядов появляется
// string[] items = project.Variables["num"].Value.Trim().Replace(".",",").Split(','); // или так, если появлятся проблемы с округлениями

int pow = 0;
if(items.Length == 2) pow = items.Last().Length;

decimal out_number = input_number + (pow > 0 ? (decimal) Math.Pow(10, -pow) * correction : correction);
project.SendInfoToLog(string.Format("in: {0} out: {1}", input_number, out_number), true);
Огонь! Благодарочка.

Добавлю еще от себя, ибо сам задался вопросом. Чтобы вернуть полученное значение в переменную, добавляем:

return out_number;
 
  • Спасибо
Реакции: BAZAg

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)