Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] округлить число с плавающ точкой до его целой части

Ответить
Настройки темы
CMD/BAT - [решено] округлить число с плавающ точкой до его целой части

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет, друзья! подскажите плиз как округлить число с плавающей точкой до его целого значения.. (просто отсекать все, что после точки и сделать из числа целое число.. без его округления в меньшую или большую сторону в зависимости от значений дробной части)

к примеру есть число 1234.456789 это число хранится в переменной %num1%
нужно взять это число из переменной %num1% привести к виду 1234 и снова поместить в переменную %num1%

используя исключительно CMD синтаксис.

как такое сотворить чудо чудное диво дивное? Спасибо!!

Отправлено: 11:52, 29-01-2018

 

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


interestingyy,
Цитата interestingyy:
к примеру есть число 1234.456789 »
Таких чисел не бывает! CMD работает только с целыми числами. То, что Вы изобразили - это текст. Даже если бы такие числа были, я бы назвал их числами с фиксированной точкой.
Преобразуем текст подобного вида в целое число с округлением
Код: Выделить весь код
@echo off
cls

Set "A=-1234.3678"
Echo:
Echo %A%
Call :Round "A"
Echo %A%

Set "B=1234.53678"
Echo:
Echo %B%
Call :Round "B"
Echo %B%

Set "A=-1234.5678"
Echo:
Echo %A%
Call :Round "A"
Echo %A%

Set "num1=1234.456789"
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%

Pause
GoTo :Eof

:Round
	Call Set "@Round=%%%~1%%"
	Set /A @Split=0
	FOR /F "tokens=1,2 delims=.," %%i IN ("%@Round%") DO Set /A @Round=%%i &If Not "%%j"=="" Set /A @Split=1%%j
	Set /A @Split=%@Split:~1,1%
	Set /A %~1=%@Round%
	If "%@Round:~0,1%"=="-" (
		If %@Split% GEQ 5 Set /A %~1=%@Round%-1
	) Else ( 
		If %@Split% GEQ 5 Set /A %~1=%@Round%+1  
	)
GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-01-2018 в 13:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:53, 29-01-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


ага.. понятно.. значит то у меня строку функция выдает.. понятно.. большое вам спасибо!

сейчас буду разбирать ваш код! я в cmd не очень силен.. ваши знания куда более существенные! спасибо вам за помощь!

но кол-во знаков справо от разделительной точки, как и слева от нее - может быть абсолютно разным..
переменная %num% может принимать значения как 1.23 так и 23.5678 123.890432 569.492247 9999.99999 или 789075.7875 вобщем любые) и надо просто отсекать все, что справо от точки и саму точку..
в %num% у меня хранится значение времени в секундах.. это длительность видео в секундах, полученная при помощи команды

Код: Выделить весь код
ffprobe -v error -show_entries format=duration video.avi -of default=nopr
int_wrappers=1:nokey=1

Последний раз редактировалось interestingyy, 29-01-2018 в 14:10.


Отправлено: 13:38, 29-01-2018 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


interestingyy,
Цитата interestingyy:
надо просто отсекать все, что справо от точки и саму точку »
Ну, это в одно действие, это гораздо проще, если округлять не надо!
Код: Выделить весь код
@echo off
cls

Set "num1=1234.456789"

Echo %num1%
FOR /F "tokens=1 delims=.," %%i IN ("%num1%") DO Set /A num1=%%i
Echo %num1%

Pause
или
Код: Выделить весь код
@echo off
cls

Set "num1=1234.456789"

Echo %num1%
Set /A num1=%num1% 2>nul
Echo %num1%

Pause

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-01-2018 в 14:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:48, 29-01-2018 | #4


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Ну, это в одно действие, это гораздо проще, если округлять не надо! »
Вот!!! вариант 1, что вы предложили идеально подходит!!! большое вам спасибо!!
Я бы сам долбался долго))) а можно вас еще попросить помочь мне код более компактным написать.. я чуть позже на этом форуме создам новую ветку с названием "Помогите организовать циклическую обработку файлов".. у меня есть код рабочий.. я его сам составил.. но там все в цикл запихнуть нужно..
это по обработке видео..

Отправлено: 15:23, 29-01-2018 | #5


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


interestingyy, Оба варианта из поста #4 работают одинаково, причем второй - короче. Короче одной строки (если не учитывать присваивание и эхо для отображения) придумать трудно
А с округлением чуть короче. Вся кухня - в подпрограмме :Round, всё остальное - примеры её использования и отображение результатов
Код: Выделить весь код
@echo off
cls

Set "A=-1234,3678"
Echo:
Echo %A%
Call :Round "A"
Echo %A%

Set "B=1234.53678"
Echo:
Echo %B%
Call :Round "B"
Echo %B%

Set "A=-1234.5678"
Echo:
Echo %A%
Call :Round "A"
Echo %A%

Set "num1=1234.456789"
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%


Set "num1=1234"
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%

Set "num1=1234."
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%

Set "num1=1234.0123"
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%

Set "num1=1234.0"
Echo:
Echo %num1%
Call :Round "num1"
Echo %num1%

Pause
GoTo :Eof

:Round
	Call Set "@Round=%%%~1%%.0"
	Set /A @Split=1%@Round:*.=% 2>nul
	Set /A @Split=%@Split:~1,1% 2>nul
	Set /A @Round=%@Round% 2>nul
	If %@Split% GEQ 5 (Set /A @Split=1) Else (Set /A @Split=0)
	If %@Round% LSS 0 Set /A @Split=-%@Split%
	Set /A %~1=%@Round%+%@Split%
GoTo :Eof
Цитата interestingyy:
помочь мне код более компактным написать.. я чуть позже на этом форуме создам новую ветку »
Решаем проблемы по мере их поступления

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:35, 29-01-2018 | #6


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Решаем проблемы по мере их поступления »
Уже создал тему)) Спасибо большое за помощь!

Да, учится на ваших кодах буду!

Отправлено: 15:44, 29-01-2018 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] округлить число с плавающ точкой до его целой части

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Изменить разделитель целой и дробной части через групповые политики. James Marsh Microsoft Windows 8 и 8.1 0 08-04-2016 20:20
Число мобильных пользователей Интернета превысит число его ПК-пользователей к 2016 го OSZone News Новости информационных технологий 0 30-10-2012 20:30
CMD/BAT - [решено] Сменить разделитель целой и дробной части AlexVong Скриптовые языки администрирования Windows 1 15-04-2011 21:32
Debian/Ubuntu - Как изменить разделитель целой и дробной части? NordWest Общий по Linux 6 26-11-2009 10:55
[решено] какая ветвь реестра отвечает за разделитель целой и дробной части? dimds Microsoft Windows NT/2000/2003 3 16-06-2006 18:22




 
Переход