Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Округление до нужного знака
as-masterДата: Суббота, 03 Ноября 2007, 21:00 | Сообщение # 1
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Надо округлить результат вычислений до нужного знака, скажем две цифры после запятой.
Чтобы программа не выводила все десять или сколько там знаков.
Пока у меня в голове только вариант - искать позицию запятой (или точки?),
прибавить к номеру позиции нужное число знаков и функцией StrGet или другой подобной
выдернуть нужный результат.

Может, у кого есть идеи получше?




Да пребудет с вами ММВ!
 
toizyДата: Суббота, 03 Ноября 2007, 22:17 | Сообщение # 2
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Сперва StrCopy до нужного кол-ва знаков, затем StrIns запятой в нужную позицию. Только так, я думаю

Жизнь оказалась не такой уж и забавной, как поначалу...
 
as-masterДата: Суббота, 03 Ноября 2007, 22:23 | Сообщение # 3
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Так нет, запятая (точнее точка) в результате уже и так есть.
Просто после неё еще туева куча знаков, а надо оставить всего максимум два.
Пока я написал такой вариант:

byte=VAL(DirectorySize$)
mb=byte/1048576
mb$=CHAR(mb)
comma$='.'
pos=POS(comma$,mb$)+2
mb$=StrCopy(mb$,1,pos)
mess$='"Размер созданного вами альбома составляет '+mb$+' мегабайт",64'
MessageEx("Размер альбома","mess$")

Добавлено (03 Ноября 2007, 22:23)
---------------------------------------------
Ну а как еще сделаешь? Ладно, и так пойдет.


Да пребудет с вами ММВ!
 
toizyДата: Суббота, 03 Ноября 2007, 22:29 | Сообщение # 4
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
c=98.76543210
i=c*100
i=INT(i)/100
Message("","i")


Жизнь оказалась не такой уж и забавной, как поначалу...
 
as-masterДата: Суббота, 03 Ноября 2007, 22:35 | Сообщение # 5
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Остроумно! :)

В итоге стало так:

byte=VAL(DirectorySize$)
mb=byte/10485.76
mb=INT(mb)/100




Да пребудет с вами ММВ!
 
toizyДата: Суббота, 03 Ноября 2007, 22:41 | Сообщение # 6
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Quote (as-master)
mb=byte/10485.76

Остроумно smile


Жизнь оказалась не такой уж и забавной, как поначалу...
 
RushДата: Воскресенье, 04 Ноября 2007, 06:04 | Сообщение # 7
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (as-master)
byte=VAL(DirectorySize$)
mb=byte/10485.76
mb=INT(mb)/100

Красиво!!! Мне очень понравилось.
А вы, кстати, знаете, что ММВ позволяет все это даже в одну строчку написать?
mb=INT(VAL(DirectorySize$)/10485.76)/100

Добавлено (04 Ноября 2007, 06:04)
---------------------------------------------
Игрался тут с циферками и обнаружил интересную особенность. Функции INT и ABS понимают только 32-битный формат данных (Long). То есть, если число будет выходить за диапазон от -2 147 483 648 до +2 147 483 647, то результат функции будет неправильным.
Но что интересно, если рассматривать это не как число, а как данные и диапазон подпадает под 32-битный ( от 0 до 4294967295 = 2147483648 + 2147483647 ), результат будет правильным, но именно как данных 32-битного типа.
Например, INT(2147483648) будет равен -2147483648, INT(2147483649) будет равен -2147483647, а INT(4294967295) будет равен -1.
Я-то, чтобы получить правильное значение типа Long, в своем проекте bits писал такой код:

Code
If (Long>2147483647) Then
   Long=Long-4294967296
End

А надо было всего лишь написать заместо этих трех строк одну:
Code
Long=INT(Long)

Если же диапазон выходит за рамки 32 бит, то снова начинается все с нуля:
INT(4294967296)=0
INT(4294967297)=1
Ну и так далее, повторяется все по новой.

Вот такие пироги на постном масле... smile
 
as-masterДата: Воскресенье, 04 Ноября 2007, 11:03 | Сообщение # 8
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Quote (Rush)
если число будет выходить за диапазон от -2 147 483 648 до +2 147 483 647,
то результат функции будет неправильным.

То есть другими словами, если я использую этот код для определения размера папки В БАЙТАХ,
то при размере папки больше 2 гигабайт с мелочью результат будет неправильным?

Впрочем, вряд ли кто-то станет создавать фотоальбом размером в два гектара.
Но за информацию большое спасибо, как всегда ты находишь такие нюансы,
которые больше никто обнаружить не способен smile


Да пребудет с вами ММВ!
 
as-masterДата: Воскресенье, 04 Ноября 2007, 12:04 | Сообщение # 9
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Только что специально проверил: при любых размерах папки
скрипт сбоя не даёт, работает правильно:

Пример проекта "Определение размера папки" прицепляю к посту.
Полную версию плагина от toizy с примером от toizy берите в теме:
Определение размера папки
В плагине имеется куча функций по работе с файловой системой.

toizy - тебе очередной респект! smile

Прикрепления: 6714816.png (4.6 Kb) · dirsize.zip (35.3 Kb)


Да пребудет с вами ММВ!
 
RushДата: Воскресенье, 04 Ноября 2007, 14:25 | Сообщение # 10
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (as-master)
Только что специально проверил: при любых размерах папки
скрипт сбоя не даёт, работает правильно:

Я совсем же не об этом. Когда у тебя применяется функция INT, число уже в нужном диапазоне. Ты ведь перед этим делишь число на 10485.76. Всегда торопишься с выводами.
 
toizyДата: Воскресенье, 04 Ноября 2007, 15:47 | Сообщение # 11
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Quote (as-master)
Полную версию плагина от toizy с примером от toizy берите в теме:

Да подождите брать-то, оно ж не доделано ещё... Блин!


Жизнь оказалась не такой уж и забавной, как поначалу...
 
as-masterДата: Воскресенье, 04 Ноября 2007, 15:57 | Сообщение # 12
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Quote (Rush)
Когда у тебя применяется функция INT, число уже в нужном диапазоне.

А, ну конечно же.
Да не тороплюсь я с выводами, просто не учел, что моё число уже уменьшено на четыре разряда.

Quote (toizy)
Да подождите брать-то, оно ж не доделано ещё... Блин!

Ага! Ну так и делай скорее!
И к тому же - хорошо ведь, если возьмут и потестируют.


Да пребудет с вами ММВ!
 
De_CadanzДата: Понедельник, 19 Ноября 2007, 08:30 | Сообщение # 13
Поднаторевший
Группа: Проверенные
Сообщений: 106
Репутация: 1
Награды: 0
Статус: Offline
А как можно сделать округление не до меньшего целого числа, а по всем правилам округления, т.е. 5.6=6, 4.5=5, 3.2=3...?

Quod licet Iovi non licet bovi
 
toizyДата: Понедельник, 19 Ноября 2007, 11:13 | Сообщение # 14
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
А я и не знаю smile

В самом деле, как?


Жизнь оказалась не такой уж и забавной, как поначалу...
 
basmeДата: Понедельник, 19 Ноября 2007, 14:47 | Сообщение # 15
MMB Club
Группа: Проверенные
Сообщений: 358
Репутация: 5
Награды: 2
Статус: Offline
Quote (toizy)
В самом деле, как?

Искать запятую, потом смотреть, какой символ за ней, и юзать условный оператор.

Добавлено (19 Ноябрь 2007, 14:47)
---------------------------------------------
То есть, например, вот так:

Code

input$=CHAR(input)
zpt$='.'
r=POS(zpt$,input$)
n=r+1
znak$=StrGet(input$,n)
znak=VAL(znak$)
If (znak<5) Then
   output=ABS(input)
Else
   output=ABS(input)+1
End
DisplayValue("Text","output")

Проверено, работает. biggrin


Сообщение отредактировал basme - Понедельник, 19 Ноября 2007, 14:49
 
toizyДата: Понедельник, 19 Ноября 2007, 18:53 | Сообщение # 16
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Ну это понятно, а без извращений? Штатной функции, вроде бы, нет... Кто знает пути короче?

Жизнь оказалась не такой уж и забавной, как поначалу...
 
RushДата: Вторник, 27 Ноября 2007, 17:33 | Сообщение # 17
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (toizy)
Ну это понятно, а без извращений? Штатной функции, вроде бы, нет... Кто знает пути короче?

Есть, конечно, и короче... smile
Вот такая немного вычурная формула вычисляет "по всем правилам округления":

round=INT(n)+(n-INT(n)>0.5)

n - число, которое требует округления.

Note: только для положительных чисел...

Сообщение отредактировал Rush - Вторник, 27 Ноября 2007, 17:53
 
toizyДата: Вторник, 27 Ноября 2007, 18:32 | Сообщение # 18
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
В математике и алгоритмизации так сказать, Rush, как всегда, на высоте!

Заношу в "Готовые ответы"!


Жизнь оказалась не такой уж и забавной, как поначалу...
 
RushДата: Вторник, 27 Ноября 2007, 18:44 | Сообщение # 19
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Для отрицательных чисел подойдет другая формула:

round=INT(n)-(n-INT(n)<-0.5)

Придется делать выбор, например:

If(n<0) Then
round=INT(n)-(n-INT(n)<-0.5)
Else
round=INT(n)+(n-INT(n)>0.5)
End

 
drorДата: Вторник, 03 Марта 2009, 16:20 | Сообщение # 20
Новый участник
Группа: Проверенные
Сообщений: 25
Репутация: 0
Награды: 0
Статус: Offline
Вижу, что речь зашла об округлении. Эти простейшие способы в несколько строк дают верное, но грубое округление.
Согласитесь, что округлять цифру 1.6 до 2 не везьде приемлемо. Я хочу прикрепить мой пример осторожного округления. Он не так уж прост. Пришлось учесть некоторые, особые ситуации с цифрами. Кроме того в примере округляются числа, имеющие целую и дробну части.
Прикрепления: rounding.mbd (5.0 Kb)


Желаю всем...
 
drorДата: Вторник, 03 Марта 2009, 16:54 | Сообщение # 21
Новый участник
Группа: Проверенные
Сообщений: 25
Репутация: 0
Награды: 0
Статус: Offline
Нашел и исправил ошибку. Вроде работает отлично. Вот после исправления:
Прикрепления: 2318591.mbd (5.0 Kb)


Желаю всем...
 
toizyДата: Среда, 04 Марта 2009, 09:15 | Сообщение # 22
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
А разве пример от Раша этого не делает? Он очень прост и великолепно справляется с задачей

Добавлено (04 Март 2009, 09:15)
---------------------------------------------
Посмотрел пример. Ну ты и наворотил! Округление до знака проще всего делать формулой Раша, немного её изменив:

n = n * 1000
If(n<0) Then
round=INT(n)-(n-INT(n)<-0.5)
Else
round=INT(n)+(n-INT(n)>0.5)
End
n = n / 1000

получаем округление до тысячных.


Жизнь оказалась не такой уж и забавной, как поначалу...
 
RushДата: Пятница, 06 Марта 2009, 14:37 | Сообщение # 23
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Буквально полмесяца назад этот вопрос поднимался и решался:
http://mmbuilder.ru/forum/12-1007-12924-16-1234981045

Тут на днях меня в переписке попросили формулу модуля числа для ММВ придумать. smile
Может еще кому сгодится.

Code

** данное число
n=-12.008
** модуль числа
nmod=n*((n>0)+(-n<0)-1)
 
toizyДата: Пятница, 06 Марта 2009, 16:10 | Сообщение # 24
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Блин, ну Раш просто гений ММВшной математики! Респект!

Добавлено (06 Март 2009, 16:10)
---------------------------------------------
Поместил в Готовые ответы


Жизнь оказалась не такой уж и забавной, как поначалу...
 
  • Страница 1 из 1
  • 1
Поиск: