как обрезать число не округляя в c#

Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
приветствую уважаемые гуру цифрового мира!
подскажите кто силён в коде, как правильно обрезать число такого вида:

0.123456789012

например так:
0.12345

т.е. не округляя его, регулярками делать громоздко.
спасибо!
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
чем не подходит округление?
 
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
получаются неверные значения. нужны точные данные.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: Анатолий
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
  • Спасибо
Реакции: Анатолий

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
double d = 0.12345678;
int decimals = 5;

return Math.Floor(d*Math.Pow(10, decimals))/Math.Pow(10, decimals);
Можно такую комбинацию
 
  • Спасибо
Реакции: Анатолий
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
спасибо! но скругление не прокатит в моём случае.
1) Странно, что не прокатит, если округлять в меньшую сторону - получается аналог "обрезания" которое ты хочешь.
int pull = 0.123456789
int result = 0.12345(6789) вниз....

int pull - 2136.4638264
int result - 2136.463(8264).

2) Через стринг вариант не прокатит, он повышает вроде при обрезании строки, сейчас прикину, хоть и компилятора нет под рукой...
 
  • Спасибо
Реакции: Анатолий

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Попробуй конечно стринг.... но я хз сработает ли.

C#:
float pull = 0.123456789101112

string mem = Convert.ToString(pull);

mem = mem.Substring(0, mem.Length - x); // где x - сколько с конца удалить.

/* или можно вот так

int index = mem.Length - 1; //количество символов

mem = mem.Remove(x, index - x); // где x - начало откуда нужно "отрезать"

*/

//потом возвращаешь во float

pull = ConvertToSingle(mem); // Вроде так....
Я вообще новичок и не в теме :an::do:
 
  • Спасибо
Реакции: Анатолий

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Если из того что я тебе предложил:
В случае если у тебя чисто положительные числа всегда -
Math.Floor округляет вниз по направлению к отрицательной бесконечности.
Вот этот метод подойдет
 
  • Спасибо
Реакции: Анатолий
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
Попробуй конечно стринг.... но я хз сработает ли.

C#:
float pull = 0.123456789101112

string mem = Convert.ToString(pull);

mem = mem.Substring(0, mem.Length - x); // где x - сколько с конца удалить.

/* или можно вот так

int index = mem.Length - 1; //количество символов

mem = mem.Remove(x, index - x); // где x - начало откуда нужно "отрезать"

*/

//потом возвращаешь во float

pull = ConvertToSingle(mem); // Вроде так....
Я вообще новичок и не в теме :an::do:
 
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
фишка в том, что после точки может быть 6 цифр, а может быть и 15...
удаление с конца не подойдёт.

в любом случае благодарю за попытку помочь.
скругление не подходит не в какую сторону, буду тогда кубиками обрезать число.
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
фишка в том, что после точки может быть 6 цифр, а может быть и 15...
удаление с конца не подойдёт.

в любом случае благодарю за попытку помочь.
скругление не подходит не в какую сторону, буду тогда кубиками обрезать число.
Отвечаю сразу на два твоих поста.
1) неявное преобразование значит, что ты объявляешь новую переменную в C# из переменной проекта (которые всегда в стринге).
Тебе надо: .ToSingle для твоей переменной из проекта прописать. Довести переменную test <string> до pull <float(single)>

2) Ещё раз по логике...

int index = mem.Length - 1; //длина твоей переменной пофигу сколько в ней цифр
mem = mem.Remove(x, index - x); // первый х - нужно тебе например 5 цифр с НАЧАЛА - эта функция отрежет Index-5 символов и оставит тебе x - 5;
 
  • Спасибо
Реакции: Анатолий

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
фишка в том, что после точки может быть 6 цифр, а может быть и 15...
удаление с конца не подойдёт.

в любом случае благодарю за попытку помочь.
скругление не подходит не в какую сторону, буду тогда кубиками обрезать число.
А вообще оно тебе нафиг не надо первое преобразование, если у тебя переменная в проекте висит. Т.к. она типа стринг - из последнего моего поста формула подойдёт.
 
  • Спасибо
Реакции: Анатолий

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: Анатолий
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28
ну у тебя же твоём коде, который тебе не нравился, как-то переменная передавалась. Передай также
тут можно поподробнее:
вот этот скруглитель работает.
как сделать чтобы он стал обрезателем?

return System.Math.Round(Convert.ToDecimal(project.Variables["test"].Value), 8 ) ;
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
double d = Double.Parse(project.Variables["test"].Value) ;
int decimals = 5;

return Math.Floor(d*Math.Pow(10, decimals))/Math.Pow(10, decimals);
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
тут можно поподробнее:
вот этот скруглитель работает.
как сделать чтобы он стал обрезателем?

return System.Math.Round(Convert.ToDecimal(project.Variables["test"].Value), 8 ) ;
Всё прекрасно работает. Иди разбирайся с кодом.
42494
 
  • Спасибо
Реакции: Анатолий
Регистрация
13.04.2016
Сообщения
650
Благодарностей
53
Баллы
28

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Переводишь число в строку, субстрингом обрезаешь нужное количество символов, конвертишь обратно в число.
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: Astraport

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
а если перед точкой другое число цифр? а если после? А если число отрицательное?
утёрся) я изначально предположил, что у него числа только положительные и диапазон от 0 до 1 . Можно конечно ещё поиск позиции точки встроить, но это уже сложнее чем операнд предложенный выше.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Можно конечно ещё поиск позиции точки встроить, но это уже сложнее чем операнд предложенный выше.
Без проверки на ошибки, достаточно просто

C#:
        double chislo = 0.123456789012;
        
        string stroka = chislo.ToString();
        
        var data = stroka.Split('.');
        
        string drobnaya = data[1];
        
        drobnaya = drobnaya.Substring(0, 5); // сколько оставить.
        
        string result = data[0] + "." + drobnaya;
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Без проверки на ошибки, достаточно просто

C#:
        double chislo = 0.123456789012;
       
        string stroka = chislo.ToString();
       
        var data = stroka.Split('.');
       
        string drobnaya = data[1];
       
        drobnaya = drobnaya.Substring(0, 5); // сколько оставить.
       
        string result = data[0] + "." + drobnaya;
Угу. В моем понимании "Сложнее" это просто количество строк в конструкции)) К чему мы и пришли) Отличный выход, я примерно так себе всё и представлял.
 

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