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

Форум MySQL

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

 

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

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

тема: проблемы с округлением
 
 автор: ronin80   (21.03.2008 в 13:06)   письмо автору
 
 

Люди добрые помогите кто может :)

Проблема такая:

есть таблица с изделиями в которой есть столбец с расчётной ценой calc_price float(10,2)

есть кнопочка на форме для расчёта цены по прейскуранту

так вот расчётная цена получается по следующей формуле (в хранимой процедуре):
SET calc_price=round(vcalc_price*vkoeff);

vcalc_price - переменная для сохранения цены float(10,2)
vkoeff - коэффициент скидки/надбавки для изделия float(10,2)

ошибка состоит в том что неправильно происходит округление расчётной цены, например получается такая формула:

SET calc_price=round(90.00*0.75);

здесь по идее должно получиться 68, а MySql ставит 67

если я делаю округление до 2х десятых то получаем значение 67.50

почему так происходит я не понимаю

   
 
 автор: olejek   (21.03.2008 в 13:17)   письмо автору
 
   для: ronin80   (21.03.2008 в 13:06)
 

Английский понимаете?
Before MySQL 5.0.3, the behavior of ROUND() when the argument is halfway between two integers depends on the C library implementation. Different implementations round to the nearest even number, always up, always down, or always toward zero. If you need one kind of rounding, you should use a well-defined function such as TRUNCATE() or FLOOR() instead.

   
 
 автор: ronin80   (21.03.2008 в 13:35)   письмо автору
 
   для: olejek   (21.03.2008 в 13:17)
 

версия: 5.0.6-beta-nt

попробовал и truncate и floor - результат тот же - 67.5 округляет до 67

хотя в query browser задаю запрос select round(90*0.75) выдаёт 68

что за бред?

   
 
 автор: ronin80   (21.03.2008 в 13:40)   письмо автору
 
   для: ronin80   (21.03.2008 в 13:35)
 

а например в случае

SET calc_price=round(470.00*0.85);

получает 400, хотя здесь такой же случай - при округлении до десятых получаем 399.50

   
 
 автор: ronin80   (21.03.2008 в 14:08)   письмо автору
 
   для: ronin80   (21.03.2008 в 13:40)
 

хотел уточнить ещё один момент:

SET calc_price=round(470.00*0.85); здесь я подразумеваю значения подставляемые переменными

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

переменные принимают значение столбцов из таблиц путём запроса select *** into *** from *** where ***

типы столбцов значения которых принимают переменные соответственно float(10,2)

т.е. получается в данном случае значение столбца price для данного изделия равно 90.00, коэффициент koeff = 0.75
соответственно данные значения вытаскиваем по коду изделия

   
 
 автор: ronin80   (21.03.2008 в 16:00)   письмо автору
 
   для: ronin80   (21.03.2008 в 14:08)
 

ну помогите же ктонить

   
 
 автор: ronin80   (21.03.2008 в 16:13)   письмо автору
 
   для: ronin80   (21.03.2008 в 16:00)
 

ну очень надо сделать

   
 
 автор: cheops   (21.03.2008 в 16:39)   письмо автору
 
   для: ronin80   (21.03.2008 в 13:40)
 

>а например в случае
>
>SET calc_price=round(470.00*0.85);
>
>получает 400, хотя здесь такой же случай - при округлении до десятых получаем 399.50
Всё правильно, 399.5 всегда до 400 округляется.

   
 
 автор: ronin80   (24.03.2008 в 07:41)   письмо автору
 
   для: cheops   (21.03.2008 в 16:39)
 

>Всё правильно, 399.5 всегда до 400 округляется.

тогда почему 67.5 округляет до 67?

попробовал создать таблицу с полем price float(10,2), добавил туда строку со значением 67.5, затем выполнил запрос select round(price) from table - в ответ получил 67

КАК ТАКОЕ ВОЗМОЖНО? может настройки сервера неверные? Так опять же 399.5 округляет до 400 :)

   
 
 автор: cheops   (24.03.2008 в 10:48)   письмо автору
 
   для: ronin80   (24.03.2008 в 07:41)
 

Хм... может ошибка вычисления накапливается... в любом случае лучше воспользоваться типом DECIMAL вместо FLOAT - он поаккуратнее с числами работает (для денег проектировался).

   
 
 автор: ronin80   (24.03.2008 в 11:04)   письмо автору
 
   для: cheops   (24.03.2008 в 10:48)
 

проблематично будет сейчас переписать целый модуль :)

пришлось написать свою небольшую функцию округления с использованием truncate и строковых функций типа substring

заметил что округление до десятых с помощью round выполняется корректно, таким образом округление до десятых выполнил с помощью round а далее моя функция

вот такие заморочки )

   
Rambler's Top100
вверх

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