Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] округлить число с плавающ точкой до его целой части (http://forum.oszone.net/showthread.php?t=332845)

interestingyy 29-01-2018 11:52 2794333

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

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

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

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

megaloman 29-01-2018 12:53 2794348

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


interestingyy 29-01-2018 13:38 2794363

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

сейчас буду разбирать ваш код! я в 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


megaloman 29-01-2018 14:48 2794376

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


interestingyy 29-01-2018 15:23 2794389

Цитата:

Цитата megaloman
Ну, это в одно действие, это гораздо проще, если округлять не надо! »

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

megaloman 29-01-2018 15:35 2794391

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
помочь мне код более компактным написать.. я чуть позже на этом форуме создам новую ветку »

Решаем проблемы по мере их поступления

interestingyy 29-01-2018 15:44 2794394

Цитата:

Цитата megaloman
Решаем проблемы по мере их поступления »

Уже создал тему)) Спасибо большое за помощь!

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


Время: 23:00.

Время: 23:00.
© OSzone.net 2001-