|
|
|
| Люди добрые помогите кто может :)
Проблема такая:
есть таблица с изделиями в которой есть столбец с расчётной ценой 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
почему так происходит я не понимаю | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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:35)
| | а например в случае
SET calc_price=round(470.00*0.85);
получает 400, хотя здесь такой же случай - при округлении до десятых получаем 399.50 | |
|
|
|
|
|
|
|
для: 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 в 14:08)
| | ну помогите же ктонить | |
|
|
|
|
|
|
|
для: ronin80
(21.03.2008 в 16:00)
| | ну очень надо сделать | |
|
|
|
|
|
|
|
для: ronin80
(21.03.2008 в 13:40)
| | >а например в случае
>
>SET calc_price=round(470.00*0.85);
>
>получает 400, хотя здесь такой же случай - при округлении до десятых получаем 399.50
Всё правильно, 399.5 всегда до 400 округляется. | |
|
|
|
|
|
|
|
для: 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 :) | |
|
|
|
|
|
|
|
для: ronin80
(24.03.2008 в 07:41)
| | Хм... может ошибка вычисления накапливается... в любом случае лучше воспользоваться типом DECIMAL вместо FLOAT - он поаккуратнее с числами работает (для денег проектировался). | |
|
|
|
|
|
|
|
для: cheops
(24.03.2008 в 10:48)
| | проблематично будет сейчас переписать целый модуль :)
пришлось написать свою небольшую функцию округления с использованием truncate и строковых функций типа substring
заметил что округление до десятых с помощью round выполняется корректно, таким образом округление до десятых выполнил с помощью round а далее моя функция
вот такие заморочки ) | |
|
|
|