SQLServerCentral.com / Article Discussions / Article Discussions by Author / Discuss content posted by Julie Zeien / Fun with Decimals / Latest PostsInstantForum.NET v2.9.0SQLServerCentral.comhttp://www.sqlservercentral.com/Forums/notifications@sqlservercentral.comTue, 01 Dec 2015 21:07:02 GMT20RE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxGreat question Julie, even if the explanation was not exactly right. I was unaware of this behaviour, and THAT is the point of asking and discussing it :)Sat, 20 Mar 2010 10:01:02 GMTPeter TrastRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspx[quote][b]Julie Zeien (12/16/2009)[/b][hr]I apologize for the incorrect explanation. I ran into a problem with this sort of thing about 3 months ago, and I looked all over BOL EXCEPT for the decimal data type page. Oops. I thought this was an undocumented problem, so I played with it for a couple hours and came to an incorrect conclusion. Hopefully Steve can fix it. Thank you to those who knew the correct reason behind this.[/quote]Unfortunately it's very easy play with something for a while, form a mental model of what's going on, then try a few tests to check the model and when they work believe it is true. So don't worry to much at having done it - we all do it sometimes. The great trick is to find some tests that will check all the edge conditions implied by the model, which is sometimes very hard to do.Sat, 06 Feb 2010 18:43:55 GMTTomThomsonRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxA better question would have been, what is the result of:SELECT CONVERT(DECIMAL, 1.2)Fri, 08 Jan 2010 11:50:53 GMTbvbellomoRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxThe important point with this question is that you should never take anything for granted and always specify "optional" paramters/statementsFri, 08 Jan 2010 07:34:23 GMThakan.wintherRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxJulie, I've been through a similar experience posting a QOD and then finding out that I'd missed a point. Don't fret over that.But, more important than a statement of the correct explanation for your results, folks should realize that NEITHER example is really a correct construction. You said it yourself in the explanation, so let's see the real effect of not specifying precision. This query:[code="sql"]DECLARE @TestDecimal DECIMAL(8, 2)SET @TestDecimal = 275953.73SELECT CONVERT( DECIMAL, @TestDecimal * 0.40 ) , CONVERT( DECIMAL, @TestDecimal ) * 0.40 , CONVERT( DECIMAL(8,2), @TestDecimal * 0.40 )[/code]returns [code="plain"]110381 110381.60 110381.49[/code]Only the last column, the one produced with an explicit precision, is correct. The CONVERT in the second column rounds the local variable 275953.73 to 275954 before doing the multiplication by 0.40.Thu, 17 Dec 2009 11:28:00 GMTjohn.arnottRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxI apologize for the incorrect explanation. I ran into a problem with this sort of thing about 3 months ago, and I looked all over BOL EXCEPT for the decimal data type page. Oops. I thought this was an undocumented problem, so I played with it for a couple hours and came to an incorrect conclusion. Hopefully Steve can fix it. Thank you to those who knew the correct reason behind this.Wed, 16 Dec 2009 09:20:16 GMTJulie HargravesRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxCorrect answer, but the explanation is completely wrong!Wed, 16 Dec 2009 09:00:15 GMTToreadorRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspx[quote][b]Bhavesh_Patel (12/15/2009)[/b][hr]Why answer differs when we are using the same function on same variable?[/quote]Because we're not actually running the function on the same variable. In the first column, we're doing the following:CONVERT(DECIMAL, @TestDecimal * 0.40)Procedurally, this is1. Multiply @TestDecimal by 0.402. Convert the result to DECIMAL, using the defaults (precision 18, scale 0). This is where the rounding occurs.In column 2, we're doingCONVERT(DECIMAL, @TestDecimal) * 0.40Procedurally, this is1. Convert the value in @TestDecimal to DECIMAL, using the defaults (precision 18, scale 0). Since there's nothing to the right of the decimal, the value is not changed (although the data type is.)2. Multiply this by 0.40. This creates a resulting value with digits to the right of the decimal point. See [url]http://technet.microsoft.com/en-us/library/ms190476.aspx[/url] for details on how SQL Server determines the precision and scale of a result of a mathematical operation on DECIMAL values.Wed, 16 Dec 2009 07:27:07 GMTsknoxRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspx[quote][b]Explanation[/b][hr]When precision is not specified with the decimal type, TSQL will use whatever precision would use the minimum space to store with the number it is converting to.[/quote]This is not correct. SQL Server does not use "whatever precision" in this case. Here is the quote from BOL about precision ([url]http://msdn.microsoft.com/en-us/library/ms187746.aspx[/url]):[quote][b]decimal and numeric (Transact-SQL)[/b][hr]p (precision) The maximum total number of decimal digits that can be stored, both to the left and to the right of the decimal point. The precision must be a value from 1 through the maximum precision of 38. [b]The default precision is 18.[/b][/quote]So when precision is not specified, SQL Server uses the value = 18.Another quote from BOL:[quote]s (scale) The maximum number of decimal digits that can be stored to the right of the decimal point. ... [b]The default scale is 0[/b]; therefore, 0 <= s <= p.[/quote]Thus the expression "CONVERT(DECIMAL, @var)" is equal to "CONVERT(DECIMAL(18,0), @var)".The batch from the example is equal to:[code="sql"]DECLARE @TestDecimal DECIMAL(8, 2)SET @TestDecimal = 275953.00SELECT CONVERT( DECIMAL(18,0), @TestDecimal * 0.40 ) , CONVERT( DECIMAL(18,0), @TestDecimal ) * 0.40[/code][quote][b]Bhavesh_Patel[/b][hr]Why answer differs when we are using the same function on same variable?[/quote]In the first expression, the result of multiplication is converted to DECIMAL:CONVERT(DECIMAL, @TestDecimal * 0.40) = CONVERT(DECIMAL(18,0), 275953.00 * 0.40) = CONVERT (DECIMAL(18,0), 110381.2000) = 110381In the second expression, the multiplier is converted to DECIMAL:CONVERT(DECIMAL, @TestDecimal) * 0.40 = CONVERT(DECIMAL(18,0), @TestDecimal) * 0.40 = 275953 * 0.40 = 110381.20Wed, 16 Dec 2009 05:04:18 GMTvk-kirovRE: Fun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxWhy answer differs when we are using the same function on same variable?Tue, 15 Dec 2009 23:17:07 GMTBhavesh_PatelFun with Decimalshttp://www.sqlservercentral.com/Forums/Topic834843-1717-1.aspxComments posted to this topic are about the item [B]<A HREF="/questions/T-SQL/68385/">Fun with Decimals</A>[/B]Tue, 15 Dec 2009 22:24:22 GMTJulie Hargraves