2011-10-21 4 views
4

Я пытаюсь рассчитать проценты от суммы в долларах. На 50%, иногда вы получаете половину копейки, и мне нужно округлить ее до ближайшего цента.Почему TSQL на Sql Server 2000 округляет десятичные числа непоследовательно?

В Sql, мой расчет заключается в следующем:

round(retail * 0.5, 2, 0)

Если я принимать следующие значения я получаю разные результаты:

  • 4,39
  • 2,49

Неограниченный Я получаю:

  • 4,39 -> 2,195
  • 2,49 -> 1,245

Когда округляется я получаю:

  • 2,195 -> 2,19
  • 1,245 -> 1,25

Мне сказали, что это форма «округления банкира», но, похоже, ke значение, влияющее на направление округления, представляет собой целочисленное значение.

Моя проблема в том, что я ожидаю, что верхнее значение округляется до 2,20. Если это действительно округление банкиров, и на это влияет целочисленное значение, есть ли у кого-нибудь пример для предотвращения такого поведения. Если это не округление банкиров, может кто-то, пожалуйста, дать объяснение и, возможно, решение просто получить нормальное поведение округления?

Заранее благодарен!

+0

хорошо, я попытался это в SQL Server 2008 и I получить 2.200; не может помочь вам с sql 2000, хотя вы пробовали это: select round (4.39 * 0.5.2.0) => my result = 2.2. – Pleun

ответ

3

Какого типа данных retail? Я не могу проверить это на SQL 2000, но на SQL 2008 R2 я вижу похожие результаты, если я использую float.

float:   4.39 --> 2.195, rounds to 2.19 
       2.49 --> 1.245, rounds to 1.25 

money:   4.39 --> 2.195, rounds to 2.20 
       2.49 --> 1.245, rounds to 1.25 

decimal(5,2): 4.39 --> 2.195, rounds to 2.20 
       2.49 --> 1.245, rounds to 1.25 

Чтобы показать приближение, созданное float, вы можете бросить в decimal(20,19) и становится понятно, почему это округление так:

4.39 * 0.5 --> 2.1949999999999999000 
2.49 * 0.5 --> 1.2450000000000001000 
+0

Я использовал float. Я буду тестировать другие типы. Я даже не думал об этом. Благодаря! – IronicMuffin

+0

Нет проблем. Это хороший пример того, почему вы использовали бы «money» или «decimal» вместо приблизительного типа данных, такого как 'float'. –

Смежные вопросы