Округление до нужного знака
|
|
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 Остроумно
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
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 А надо было всего лишь написать заместо этих трех строк одну: Если же диапазон выходит за рамки 32 бит, то снова начинается все с нуля: INT(4294967296)=0 INT(4294967297)=1 Ну и так далее, повторяется все по новой. Вот такие пироги на постном масле...
|
|
| |
as-master | Дата: Воскресенье, 04 Ноября 2007, 11:03 | Сообщение # 8 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (Rush) если число будет выходить за диапазон от -2 147 483 648 до +2 147 483 647, то результат функции будет неправильным. То есть другими словами, если я использую этот код для определения размера папки В БАЙТАХ, то при размере папки больше 2 гигабайт с мелочью результат будет неправильным? Впрочем, вряд ли кто-то станет создавать фотоальбом размером в два гектара. Но за информацию большое спасибо, как всегда ты находишь такие нюансы, которые больше никто обнаружить не способен
Да пребудет с вами ММВ!
|
|
| |
as-master | Дата: Воскресенье, 04 Ноября 2007, 12:04 | Сообщение # 9 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Только что специально проверил: при любых размерах папки скрипт сбоя не даёт, работает правильно: Пример проекта "Определение размера папки" прицепляю к посту. Полную версию плагина от toizy с примером от toizy берите в теме: Определение размера папки В плагине имеется куча функций по работе с файловой системой. toizy - тебе очередной респект!
Да пребудет с вами ММВ!
|
|
| |
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
| А я и не знаю В самом деле, как?
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
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") Проверено, работает.
Сообщение отредактировал 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) Ну это понятно, а без извращений? Штатной функции, вроде бы, нет... Кто знает пути короче? Есть, конечно, и короче... Вот такая немного вычурная формула вычисляет "по всем правилам округления": 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 не везьде приемлемо. Я хочу прикрепить мой пример осторожного округления. Он не так уж прост. Пришлось учесть некоторые, особые ситуации с цифрами. Кроме того в примере округляются числа, имеющие целую и дробну части.
Желаю всем...
|
|
| |
dror | Дата: Вторник, 03 Марта 2009, 16:54 | Сообщение # 21 |
Новый участник
Группа: Проверенные
Сообщений: 25
Репутация: 0
Награды: 0
Статус: Offline
| Нашел и исправил ошибку. Вроде работает отлично. Вот после исправления:
Желаю всем...
|
|
| |
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 Тут на днях меня в переписке попросили формулу модуля числа для ММВ придумать. Может еще кому сгодится. 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) --------------------------------------------- Поместил в Готовые ответы
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |