Nieprawidłowe zaokrąglanie w MSSQL?

Ostatnio spotkał mnie ciekawy „problem” w Microsoft SQL Server. Można było wręcz zasugerować, że po prostu Microsoft bardzo się pomylił w tworzeniu swojego silnika bazodanowego 😉 Rozważmy następujący przykład:

W powyższym kodzie zadeklarowano dwie zmienne @float oraz @numeric o typach zgodnych z nazwami. W zapytaniu SELECT stosujemy funkcję ROUND(), zaokrąglając wyniki do drugiego miejsca po przecinku zgodnie z zasadami matematyki:

  • cyfra 0-4 na trzecim miejscu po przecinku – odcinanie cyfr na dalszych miejscach niż drugie;
  • cyfra 5-9 na trzecim miejscu  po przecinku – następuje zwiększenie cyfry na drugim miejscu o 1 w górę.

Dlaczego jednak otrzymujemy złe wyniki w przypadku zaokrąglania zmiennej @float? Związane jest to oczywiście z typami danych. Typ float przechowuje wartości przybliżone. Wolno go stosować wtedy, gdy potrzebujemy przechować bardzo duże wartości kosztem precyzji (np. w przypadku obliczeń naukowych). Rzutowanie zmiennej @float na typ numeric przed skorzystaniem z funkcji przybliżania rozwiązuje ten problem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *