:: Visual Foxpro, Foxpro for DOS
Правила округления
Владимир Максимов
Автор

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Устанавливаю соединение VFP+MS SQL (пробовал на разных версиях - результат одинаковый)

SET DECIMALS TO 4
aa=18.6450
SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test')
?'param ',m.aa,' result ',test.sum1
aa=18.6451
SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test')
?'param ',m.aa,' result ',test.sum1
aa=18.6450
SQLEXEC(np_connection, 'select ROUND('+TRANSFORM(m.aa)+',2) as sum1','test')
?'value ',m.aa,' result ',test.sum1

Результат
param 18,6450 result 18,64
param 18,6451 result 18,65
value 18,6450 result 18,65

Чем объясняется использование разных правил округления при передаче значения как параметр и при явном задании значения?

Проверял на VFP6, VFP9, MS SQL 6.5, MS SQL2000




------------------
Ratings: 0 negative/0 positive
Re: Правила округления
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Но что самое интересное выполнение в QA:
select round(18.6450,2),round(18.6451,2)
Дает результат:
18.6500




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: Правила округления
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Похоже, что самый правильный результат дает:
aa=18.6450
SQLEXEC(np_connection, 'select ROUND('+TRANSFORM(m.aa)+',2) as sum1','test')




------------------
Без коментариев..
Ratings: 0 negative/0 positive
Придумал выход
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
forum.foxclub.ru




------------------
Ratings: 0 negative/0 positive
Re: Придумал выход
Владимир Максимов
Автор

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Если ты об этом

forum.foxclub.ru

То это просто способ обойти проблему, когда хочется именно передавать данные как параметр. Непонятна причина данного глюка.




------------------
Ratings: 0 negative/0 positive
Ну конечно хочется нормально
Пашок

Сообщений: 706
Дата регистрации: 14.11.2001
передавать, а что мы можем сделать?




------------------
Ratings: 0 negative/0 positive
Re: Ну конечно хочется нормально
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Привлечь внимание специалистов из MS, чтобы они посмотрели что там да как
происходит при передаче параметров от фокса к ODBC и от ODBC к серверу...
Возможно где-то там и закралась ошибка.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Ну конечно хочется нормально
Aleksey Tsingauz [MSFT]
Здравствуйте, Игорь!

Цитата:
Привлечь внимание специалистов из MS, чтобы они посмотрели что там да как
происходит при передаче параметров от фокса к ODBC и от ODBC к серверу...
Возможно где-то там и закралась ошибка.

На сервере с float работает так же.
select ROUND(CAST(18.6450 as float),2)
select ROUND(CAST(18.64500000001 as float),2)
select ROUND(CAST(18.6450 as Numeric(10,5)),2)

Результат:
-----------------------------------------------------
18.640000000000001
(1 row(s) affected)
-----------------------------------------------------
18.649999999999999
(1 row(s) affected)
------------
18.65000
(1 row(s) affected)

Видимо это связано с неточностью представления float чисел.

Aleksey Tsingauz
Visual FoxPro Dev Team

Ratings: 0 negative/0 positive
Re: Ну конечно хочется нормально
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
А сделать чтоб через ODBC шло не Float никак не получится? Т.е. все
numeric-и будут конвертится во float?




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика