SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: surovi  
Дата: 09.06.06 17:09
Оценка:
Надо чтобы SELECT ROUND(0.045, 2) FROM ... возвращал 0.05 а не 0.04

Использую MS Access 2000, но надо чтобы работало и на MS SQL Server.
Т.е. руководствоваться ANSI SQL 92.

Вариант делать округление в вычисляемом поле не подходит, т.к. к округляемому значению применяется агрегатная функция SUM.
Вот источник проблемы:
SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate, 2)) AS Total
Поле Rate строго имеет два знака после запятой
Значение внутри ROUND может иметь любое (допустимое) количество знаков после запятой
Re: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: str1111  
Дата: 09.06.06 21:32
Оценка:
Здравствуйте, surovi, Вы писали:

S>Надо чтобы SELECT ROUND(0.045, 2) FROM ... возвращал 0.05 а не 0.04


S>Использую MS Access 2000, но надо чтобы работало и на MS SQL Server.

S>Т.е. руководствоваться ANSI SQL 92.

S>Вариант делать округление в вычисляемом поле не подходит, т.к. к округляемому значению применяется агрегатная функция SUM.

S>Вот источник проблемы:
S>SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate, 2)) AS Total
S>Поле Rate строго имеет два знака после запятой
S>Значение внутри ROUND может иметь любое (допустимое) количество знаков после запятой
самый простой вариант проверяй остаток на больше меньше если больше то округляй в одну сторону ну а если меньше в другую
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: surovi  
Дата: 10.06.06 06:04
Оценка:
Например
Re: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: DarkSid Россия  
Дата: 13.06.06 07:58
Оценка:
Здравствуйте, surovi, Вы писали:

S>Надо чтобы SELECT ROUND(0.045, 2) FROM ... возвращал 0.05 а не 0.04


S>Использую MS Access 2000, но надо чтобы работало и на MS SQL Server.

S>Т.е. руководствоваться ANSI SQL 92.

S>Вариант делать округление в вычисляемом поле не подходит, т.к. к округляемому значению применяется агрегатная функция SUM.

S>Вот источник проблемы:
S>SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate, 2)) AS Total
S>Поле Rate строго имеет два знака после запятой
S>Значение внутри ROUND может иметь любое (допустимое) количество знаков после запятой


В свое время мне помогло так
SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate +0.000001, 2)) AS Total
Re[2]: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: surovi  
Дата: 14.06.06 09:59
Оценка:
Здравствуйте, DarkSid, Вы писали:

DS>В свое время мне помогло так

DS>SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate + 0.000001, 2)) AS Total

Да, действительно, такой вариант решит проблему, но, к сожалению, не со 100% гарантией, т.к.
если округление будет зависеть от седьмого знака после запятой, то округлиться неправильно.
Например число 0.4444441 -> ROUND(0.4444441, 2) = 0.44
А если так 0.4444441 + 0.000001 = 0.4444451 -> ROUND(0.4444451, 2) = 0.45
т.е. получаются разные числа, конечно можно еще увеличить точность, до восьми знаков после запятой или больше, но опять же это не дает 100% гарантии.

Но все-равно спасибо за вариант.
Может быть есть еще предложения
Re: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: Hеmul  
Дата: 14.06.06 10:41
Оценка:
Здравствуйте, surovi, Вы писали:

S>Надо чтобы SELECT ROUND(0.045, 2) FROM ... возвращал 0.05 а не 0.04


В дельфях писал такую ф-цию. Если третий знак после запятой = 5, то делал его равным 6.
И потом уже делал округление. Пока всё работает...
Re[3]: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: DarkSid Россия  
Дата: 15.06.06 06:15
Оценка:
Здравствуйте, surovi, Вы писали:

S>Здравствуйте, DarkSid, Вы писали:


DS>>В свое время мне помогло так

DS>>SELECT SUM(ROUND((DateDiff("n", StartTime, EndTime)/60)*Rate + 0.000001, 2)) AS Total

S>Да, действительно, такой вариант решит проблему, но, к сожалению, не со 100% гарантией, т.к.

S>если округление будет зависеть от седьмого знака после запятой, то округлиться неправильно.
S>Например число 0.4444441 -> ROUND(0.4444441, 2) = 0.44
S>А если так 0.4444441 + 0.000001 = 0.4444451 -> ROUND(0.4444451, 2) = 0.45
S>т.е. получаются разные числа, конечно можно еще увеличить точность, до восьми знаков после запятой или больше, но опять же это не дает 100% гарантии.

S>Но все-равно спасибо за вариант.

S>Может быть есть еще предложения

Результаты выборки
select ROUND(0.4444441 +0.0001, 2)
.4400000

select ROUND(0.4444441 +0.001, 2)
.4500000

select ROUND(0.4444441 +0.000001, 2)
.4400000
Re[4]: SELECT ROUND(0.045, 2) FROM ... надо 0.05 а не 0.04
От: bedward70 Россия http://www.bedward70.narod.ru/
Дата: 15.06.06 10:00
Оценка:
Здравствуйте, DarkSid, Вы писали:

[]

S>>Но все-равно спасибо за вариант.

S>>Может быть есть еще предложения

DS>Результаты выборки

DS>select ROUND(0.4444441 +0.0001, 2)
DS>.4400000

DS>select ROUND(0.4444441 +0.001, 2)

DS>.4500000

DS>select ROUND(0.4444441 +0.000001, 2)

DS>.4400000

Пожет проще, прибавить половину от точности откугления (для отрицательных отнять) ..
select ROUND(0.4444441 +0.00005, 4)
select ROUND(0.4444441 +0.0005, 3)
select ROUND(0.4444441 +0.005, 2)
select ROUND(0.4444441 +0.05, 1)
С уважением, Эдвард
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.