Надо чтобы 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
Здравствуйте, 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, Вы писали:
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
Здравствуйте, 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
Здравствуйте, 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