Round functions has two behaviors: With the value cours is equal to "3.1235", round(cours, 3) = 3.123
. Although, when we replace cours by its value (3.1235) in this round formula, round(3.1235, 3) = 3.1240
.
Asked
Active
Viewed 486 times
0

Sami Kobbi
- 309
- 1
- 7
- 17
-
What type is `cours`? – Mureinik Oct 12 '16 at 14:31
-
the type of cours is float. – Sami Kobbi Oct 12 '16 at 14:32
-
Can you reproduce your problem? There is something you aren't telling us since these are equal...`declare @cours decimal (5,4) = 3.1235 select round(@cours, 3) select round(3.1235, 3) ` – S3S Oct 12 '16 at 14:34
-
I am using float type not decimal, this won't work with a float number. – Sami Kobbi Oct 12 '16 at 14:39
-
2Possible duplicate of [Is floating point math broken?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Jamiec Oct 12 '16 at 14:43
-
You've made a typo or a thinko, because there is no way that `3.something` *ever* rounds to `5.something` without additional manipulation. It *is* true that a value which displays somewhere as `3.1235` might not round to `3.1240` (because it's *really* `3.1234999999999`, for example), but that's a representation issue where the value is already being rounded under the covers. – Jeroen Mostert Oct 12 '16 at 14:51
-
Yes @JeroenMostert, I have made a typo and I have corrected it – Sami Kobbi Oct 12 '16 at 14:55
-
In that case, this is definitely a duplicate of all the other "why do I see weird rounding" questions. What's displayed on your screen as "3.1235" is most probably a rounded representation of a value that is too far away from "3.1235" to round to "3.124". In other words, in the first case, `cours` is *not* equal to 3.1235, but merely close enough to display as such. – Jeroen Mostert Oct 12 '16 at 15:05
2 Answers
0
You shouldn't be using the float datatype for specific decimal values like this as it's not designed for that purpose. Would need to see more of your code to get a better context of what you're trying to do, but if it needs to be a float initially, potentially you could cast @cours as decimal?
round(cast(@cours as decimal(5,4)), 3)

finjo
- 366
- 4
- 19
0
Your FLOAT does not really contain 3.1235, that is only what is printed or shown in a grid. Internally the FLOAT is 3.1234999999999999
, which is obviously rounded down to 3.123
.
The literal 3.1235
becomes a NUMERIC with enough precision to be totally exact, and so it is rounded up to 3.124
, as one would expect.
Proof:
SELECT CAST('3.1235' as FLOAT),
CAST( 3.1235 as FLOAT)
-- misleading output: both print 3.1235
SELECT CAST(CAST('3.1235' as FLOAT) as NUMERIC(24,23)),
CAST(CAST( 3.1235 as FLOAT) as NUMERIC(24,23))
-- both print 3.12349999999999990000000
SELECT CAST('3.1235' as NUMERIC(24,23)),
CAST( 3.1235 as NUMERIC(24,23))
-- both print 3.12350000000000000000000

Peter B
- 22,460
- 5
- 32
- 69