OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 12 Май, 2024 04:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Об округлении
СообщениеДобавлено: Воскресенье, 05 Февраль, 2006 20:40 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Есть числа вида 123.700000000000001, 117.49999999999999999 и т. д. Эти числа такие, какие есть, их источник поменять не удастся.
На самом деле это всё ошибки округления. Вопрос: как их правильно округлить? Что-то не могу придумать. Правильно - то есть до 2-х знаков после запятой. Округлить их нужно для вывода на экран/принтер. Понятно, что для вычислений в округлении необходимости нет. Хотя я тут подумал - и для вычислений (точнее сравнений) необходимость есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 06 Февраль, 2006 12:08 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
Код:
a:= Math.Round(a*100)/100;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 06 Февраль, 2006 14:26 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Trurl писал(а):
Код:
a:= Math.Round(a*100)/100;

Фиг вам, извиняюсь за выражение.
Я уже так пробовал. Независимо от величины делителя/множителя, находятся числа, которые таким образом не округляются... То есть они, конечно округляются при операции Math.Round(a*k), а вот потом при делении на k происходит опять ошибка и появляется длинный хвост нулей и девяток. На вскидку у меня примерно 20% таких чисел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 06 Февраль, 2006 14:42 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ну, преобразуйте Math.Round(a*100) в целое число n. Затем целую и дробную части исходного числа получите с помощью
x := n DIV 100;
y := n MOD 100;
Потом распечатайте x и y через точку... :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 06 Февраль, 2006 14:54 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Сергей Губанов писал(а):
Ну, преобразуйте Math.Round(a*100) в целое число n. Затем целую и дробную части исходного числа получите с помощью
x := n DIV 100;
y := n MOD 100;
Потом распечатайте x и y через точку... :D

Уууу!!! Ну я тормоз! Это от лени, наверное. Уже приготовился использовать Strings.RealToString, и плясал от этого. Кстати, а в BlackBox'е нет ли стандартных средств для работы с Currency?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 13 Май, 2006 11:32 

Зарегистрирован: Среда, 30 Ноябрь, 2005 11:46
Сообщения: 46
Привожу выписку из моего конспекта по курсу "Метрология":
Правила округления результата измерения:
1) Числовой результат измерения должен содержать столько значащих разрядов, сколько имеет погрешность результата измерения.
Погрешность результата измерения оценивается максимум 2-мя значащими цифрами, а чаще 1-ой. Если в значении погрешности старший разряд имеет
значение 4 или меньше, то оставляют 2 значащие цифры, остальные отбрасывают.

2) Если при округлении первая из отбрасываемых цифр меньше 5, то оставляемые цифры не изменяются, если - больше 5, то
младшая из оставляемых цифр увеличивается на 1, если отбрасываемая цифра является 5 , то оставляемая увеличивается на 1 если она была
нечетная и остается без изменений если была четная (правило устойчивости четных разрядов).

Пример:
0,37 \ 586915 -> 0.38
0,46 \ 1254 -> 0,46
0,5 \ 12965 -> 0,5
0,5 \ 53421 -> 0,6
0,5 \ 5032 -> 0,6
0,6 \ 5473 -> 0,6
0,003925 -> 0,004


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 13 Май, 2006 11:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы просто для информации, или намекаете, что в ББ округление как-то не так происходит? :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 13 Май, 2006 12:37 

Зарегистрирован: Среда, 30 Ноябрь, 2005 11:46
Сообщения: 46
Илья Ермаков писал(а):
Вы просто для информации, или намекаете, что в ББ округление как-то не так происходит? :-)

Конечно для информации!!! :D
Ведь на форум заходят разные люди, может кому-то и понадобятся эти правила. :lol:
Ведь если посмотреть на эти правила, то выходит, что "метрологи" округляют иначе чем "математики". :!:


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB