Re: Совсем не понятно | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
Что значит поиграй ? Мне нужно четко понимать, как он считает. Я уже поиграл, через пол года работы программы обнаружал расхождения в расчетах, максимальное расхождение получилось, 0,24 цента, ничего приятного тут нет.
Я вообще в тупике. Сервар нормально считает, если работает со своими полями, а если с переменными переданными через фокс, то просто считает неправильно, это получается, что вся программа считается неверно. ------------------ |
Re: Совсем не понятно | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Похоже, это какой-то глюк второго округления или передачи параметров. Проверь так:
Получаем ожидаемое значение 18,65. При этом количество десятичных знаков в результирующем запросе равно настройке SET DECIMALS. В данном случае 2 А вообще-то, тему можно продолжить. Если сделать явное указание значений примерно так:
То результат также будет корректным. Т.е. 18,65 ------------------ |
Re: Совсем не понятно | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
Слушай, это какая важная штука получается.
Получается нельзя передавать на сервер параметры с помощью ? знака. Совсем плохо дело. Первый вариант стремный, вообще не понятно, в каких случаях какое округление ставить, чтобы было похоже на законы математики. Может на SQL.RU спросить ? Или это может только на фоксе происходит такая лажа? В любом случае, все рассчеты сейчас под сомнением. ------------------ |
А на сервер, все правильно получается | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
declare @nl_aw numeric(7,4), @nl_aw_rate numeric(7,4) ,@nl_rate numeric(7,4) select @nl_aw = 1.9 select @nl_aw_rate = 2.675 select @nl_rate = 36.6843 select ROUND( ROUND(@nl_aw * @nl_aw_rate * @nl_rate ,2) * 0.1 ,2) as test from currency Я так понимаю, это либо фокс, либо дрова ODBC, раз сервер считает нормально ------------------ |
Кое что проясняется | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Похоже дело в каких-то правилах округления. Что-то кажется было в этой конфе по поводу отличия в правилах округления.
Понял в чем дело? Для округления недостаточно иметь 5 или больше следом за округляемым знаком. В случае, если за округляемым знаком стоит 5, то анализируется цифра стоящая следом за 5 Но вот как происходит анализ - в каких случаях какое правило применять - непонятно. И почему при явном указании значения вместо параметра правила округления другие - тоже неясно. [i][small][color=Gray]Отредактировано (20.08.04 16:13) ------------------ |
А на сервер в SQL Query analyzer | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
все хорошо, всега 65 )))))))
declare @nl_aa numeric(6,4) select @nl_aa = 18.6450 select ROUND(@nl_aa,2) declare @nl_aa1 numeric(6,4) select @nl_aa1 = 18.6451 select ROUND(@nl_aa1,2) ------------------ |
Re: А на сервер в SQL Query analyzer | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Да это-то понятно, в QA от MS SQL2000 тоже нормально работает. Если использовать не параметры а значение, тоже порядок. Проблема только при передаче как параметр. Где тут что клинит непонятно. Я задал этот вопрос в конфе по VFP9 (в нем то же самое - проверял), может кто из команды FoxPro ответит.
------------------ |
Re: А на сервер в SQL Query analyzer | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
Нужно, что-то делать, а то работа встала, непонятно как дальше делать программу.
Все так, как ты говоришь. aa=18.6450 SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test') ?test.sum1 18,64 SQLEXEC(np_connection, "select ROUND( " + str(18.6450,10,4)+ " ,2) as sum1",'test') ?test.sum1 18,65 SQLEXEC(np_connection, "select ROUND( convert(numeric(6,4)," + str(18.6450,10,4)+ ") ,2) as sum1",'test') ?test.sum1 USE 18,65 ------------------ |
Re: А на сервер в SQL Query analyzer | |
---|---|
Владимир Максимов Сообщений: 14100 Откуда: Москва Дата регистрации: 02.09.2000 |
Следи за ответами к вопросу
forum.foxclub.ru Явная проблема в способе передачи значения. При передаче по параметру - один способ округления, при передаче по значению - другой. Если срочно надо, то используй передачу по значению.
PS: Функции TRANSFORM() в отличии от STR() не требуется указывать размерность. Она переведет "как надо" в символьную строку без лишних пробелов. Причем переведет абсолютно любое значение. И символьное в том числе: ?TRANSFORM(123) ?TRANSFORM("123") ?TRANSFORM(date()) ?TRANSFORM(NTOM(123)) Аналогично можно использовать функции PADR(), PADL(), PADC() ?PADL(123.45,10) ------------------ |
Re: А на сервер в SQL Query analyzer | |
---|---|
Пашок Автор Сообщений: 706 Дата регистрации: 14.11.2001 |
Трансформ хорошо, у меня с ним две проблемы.
1ая, что вся программа уже написана ))))))))))))))))) и очень много где передача через параметр а 2ая, то, что его не очень удобно использовать У меня основная формула в виде глобальной переменной создается в начале программе. Потом я только подставляю ее в запросы. А этот с трансформ, придется использовать макроподстановки, а это опять много где править, да и эти лошадиные селекты вообще потом без поллитры не прочитаешь. Я даже больше скланяюсь к созданию временной таблицы, куда запихивать параметры, но это конечно совсем крайний вариант. Гиморой еще тот. ------------------ |
© 2000-2024 Fox Club  |