Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Принцип округления сервера mysql
 
 автор: ronin80   (13.08.2010 в 08:09)   письмо автору
 
 

Здравствуйте! У меня возникла небольшая проблема которую пока
решить не получается. Существует два запроса которые должны выдавать одинаковые результаты.
Первый запрос считает результат таким образом:

round(6.7725,2)-round(1.7625,2)-round(1.6650,2)-round(1.6800,2)

в итоге получается 1.66

второй запрос:

round(2.22*0.75,2)

в итоге получается 1.67

разница выходит в том что результатом функции round(1.7625,2) является 1.76 и это понятно
что сервер отбрасывает четвёртый знак при округлении, т.е. не учитывает при округлении.

Вопрос в том правильно ли такое округление и можно ли как то изменить поведение сервера?
Потому что мне нужно чтобы round(1.7625,2) было равно 1.77

P.S. должен уточнить что эти два запроса используют одни и те же данные и разницы не
должно быть, а таким образом иногда набегает разница до 10 сотых, что не допустимо

  Ответить  
 
 автор: Trianon   (13.08.2010 в 08:30)   письмо автору
 
   для: ronin80   (13.08.2010 в 08:09)
 

считайте в копейках
или даже в процентах копейки.

  Ответить  
 
 автор: ronin80   (13.08.2010 в 08:50)   письмо автору
 
   для: Trianon   (13.08.2010 в 08:30)
 

? не понял

  Ответить  
 
 автор: Trianon   (13.08.2010 в 08:59)   письмо автору
 
   для: ronin80   (13.08.2010 в 08:50)
 

сумма округлений станет гарантированно равна округлению суммы только в том случае, когда округление перестанет менять значение. То есть в случае целых чисел.
Вот и выражайте свою величину в целых числах.

  Ответить  
 
 автор: ronin80   (13.08.2010 в 09:07)   письмо автору
 
   для: Trianon   (13.08.2010 в 08:59)
 

>Вот и выражайте свою величину в целых числах.

результатом запроса является математическое выражение (используются функции деления и умножения), вот здесь и происходит отклонение, погрешность округления

т.е. даже если я и буду использовать целые числа, при вычислении определённых показателей нужно будет производить последовательное умножение/деление, а сервер в таком случае числа представляет как например 3.33333333333333333

  Ответить  
 
 автор: Trianon   (13.08.2010 в 09:10)   письмо автору
 
   для: ronin80   (13.08.2010 в 09:07)
 

умножение целых всегда будет целым.
А деление ... придется задать в модели явные правила округления для него.

  Ответить  
 
 автор: ronin80   (13.08.2010 в 09:18)   письмо автору
 
   для: Trianon   (13.08.2010 в 09:10)
 

>А деление ... придется задать в модели явные правила округления для него.

а можно поподробнее? это как?

  Ответить  
 
 автор: Trianon   (13.08.2010 в 09:22)   письмо автору
 
   для: ronin80   (13.08.2010 в 09:18)
 

я ж не знаю, что у Вас за деление применяется в задаче...

  Ответить  
 
 автор: Valick   (13.08.2010 в 09:09)   письмо автору
 
   для: ronin80   (13.08.2010 в 08:09)
 

что сервер отбрасывает четвёртый знак при округлении, т.е. не учитывает при округлении.
все там учитывается былоб там 1.7655 то и получили бы 1.77
вообще только недавно была тема по округлениям, можно погуглить о том как настраивать округление.
но мне кажется что проблема всетаки в вашей матиматике. где-то что-то Вы упустили, отсюда и погрешность.

  Ответить  
 
 автор: ronin80   (13.08.2010 в 09:20)   письмо автору
 
   для: Valick   (13.08.2010 в 09:09)
 

>былоб там 1.7655 то и получили бы 1.77

как вы могли заметить там 1.7625 а не явное 1.7655, т.е. последняя 5 влияет на изменение третьего знака, а он соответственно на изменение второго

  Ответить  
 
 автор: ronin80   (13.08.2010 в 09:39)   письмо автору
 
   для: ronin80   (13.08.2010 в 09:20)
 

извините привёл неверный пример не 1.7625 а 1.7645

  Ответить  
 
 автор: Valick   (13.08.2010 в 09:46)   письмо автору
 
   для: ronin80   (13.08.2010 в 09:39)
 

да без разницы...
от 0 до 4 округление в меньшуу сторону, от 5 до 9 в большую сторону и не важно какие цыфры стоят после того знака перед которым нужно осуществить округление.
http://softtime.ru/forum/read.php?id_forum=3&id_theme=74302

  Ответить  
 
 автор: Valick   (13.08.2010 в 10:27)   письмо автору
 
   для: ronin80   (13.08.2010 в 09:39)
 

round(6.7725,2)-round(1.7625,2)-round(1.6650,2)-round(1.6800,2)

а теперь внимательно следим за моими действиями
round(6.7725-1.7625-1.6650-1.6800,2) = ?
__
по поводу того что сервер отбрасывает четвертый знак и не учитывает его, да это так, я просто думал что округляем до трех знаков а не до двух

  Ответить  
 
 автор: ronin80   (13.08.2010 в 12:45)   письмо автору
 
   для: Valick   (13.08.2010 в 10:27)
 

>по поводу того что сервер отбрасывает четвертый знак и не учитывает его

это был основной вопрос :) посмотрел у оракула аналогично

просто получается что при разных формулах расчёта (в одной есть деление в другой нет) на равных источниках данных получается разный результат, из-за такого округления, а должно быть одинаково

  Ответить  
 
 автор: Valick   (13.08.2010 в 12:50)   письмо автору
 
   для: ronin80   (13.08.2010 в 12:45)
 

может быть разное количество округлений?
в примере который Вы привели четыре против одного

  Ответить  
 
 автор: ronin80   (13.08.2010 в 12:59)   письмо автору
 
   для: Valick   (13.08.2010 в 12:50)
 

именно! из-за разной группировки данных

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования