Показать полную графическую версию : [решено] округлить число с плавающ точкой до его целой части
interestingyy
29-01-2018, 11:52
Привет, друзья! подскажите плиз как округлить число с плавающей точкой до его целого значения.. (просто отсекать все, что после точки и сделать из числа целое число.. без его округления в меньшую или большую сторону в зависимости от значений дробной части)
к примеру есть число 1234.456789 это число хранится в переменной %num1%
нужно взять это число из переменной %num1% привести к виду 1234 и снова поместить в переменную %num1%
используя исключительно CMD синтаксис.
как такое сотворить чудо чудное диво дивное? Спасибо!!
megaloman
29-01-2018, 12:53
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
ага.. понятно.. значит то у меня строку функция выдает.. понятно.. большое вам спасибо!
сейчас буду разбирать ваш код! я в 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
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
Ну, это в одно действие, это гораздо проще, если округлять не надо! »
Вот!!! вариант 1, что вы предложили идеально подходит!!! большое вам спасибо!!
Я бы сам долбался долго))) а можно вас еще попросить помочь мне код более компактным написать.. я чуть позже на этом форуме создам новую ветку с названием "Помогите организовать циклическую обработку файлов".. у меня есть код рабочий.. я его сам составил.. но там все в цикл запихнуть нужно..
это по обработке видео..
megaloman
29-01-2018, 15:35
interestingyy, Оба варианта из поста #4 работают одинаково, причем второй - короче. Короче одной строки (если не учитывать присваивание и эхо для отображения) придумать трудно @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
29-01-2018, 15:44
Решаем проблемы по мере их поступления »
Уже создал тему)) Спасибо большое за помощь!
Да, учится на ваших кодах буду!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.