I have a view in SQL server, something like this:
select 6.71/3.41 as NewNumber
The result is 1.967741
(note 6 decimal points) -> decimal (38,6)
I try the same thing in a calculator but the result is 1.967741935483871xxxx
I want to force SQL Server to return more accurate result something like decimal(38,16)
I have tried the obvious things like casting, but SQL Server doesn't improve the output I just get some trailing zeros at the end like 1.9677410000
Is there a way to force SQL Server to not truncate the result or give more accurate one?
If you want something like decimal(38,16)
then you need to cast the inputs not the output after truncation has already occurred!
SELECT CAST(6.71 AS DECIMAL(38,18))/3.41 AS NewNumber
Returns
1.9677419354838709
Check the datatype
SELECT
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'BaseType'),
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'Precision'),
SQL_VARIANT_PROPERTY(CAST(6.71 AS DECIMAL(38,18))/3.41, 'Scale')
Returns
numeric 38 16
##Edit
This is just to add an additional link as follow up to the comments. The rules for datatypes resulting from decimal
to decimal
operations are described in BOL.
+-----------+------------------------------------+---------------------+
| Operation | Result precision | Result scale * |
+-----------+------------------------------------+---------------------+
| e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
+-----------+------------------------------------+---------------------+
That link includes the following phrase
*The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.
but leaves it unspecified exactly how such truncation is performed. This is documented here (wayback machine link).