我有一组存储过程可以进行一组计算,但是在使用十进制类型时我似乎失去了精度。
我期待下面的计算0.0493318673793 - 相反,我得到0.049331。我已经测试了不同的数据类型,以及我在使用浮点数后得到的准确性(我应该避免使用浮点数)。
--Representative of SP
SELECT CAST(4000000.00 AS MONEY)/CAST(81083490.50 AS DECIMAL(34,26))
--0.049331
--Using greater decimal precision
SELECT CAST(4000000.00 AS MONEY)/CAST(81083490.50 AS DECIMAL(38,16))
--0.0493318
--Using Float
SELECT CAST(4000000.00 AS MONEY)/CAST(81083490.50 AS FLOAT)
--0.0493318673793403
漂浮物真的那么糟糕吗?如果是这样,我有什么替代方案?
探索哈姆雷特注意如下。为什么以下提供不同的输出?
SELECT CAST(4000000.00 AS MONEY)/CAST(81083490.50 AS DECIMAL(38,16))
--0.0493318
SELECT CAST(4000000.00 AS MONEY)/CAST(81083490.50 AS DECIMAL(38,3))
--0.04933186737934031096
答案 0 :(得分:0)
这只会回答你的问题“浮动那么糟糕吗?”......
您是否要求某人支付到小数点后15位? ;)因为money
似乎只有4位小数精度。
至于关于float
的那个着名的事情,如果你对使用它犹豫不决,那么它有意义due to this和this。但在您的情况下,float
可以满足您的需求,而float
可提供最多15个小数点的精确度。但它是一种近似的数据类型。因此,如果您想使用float
来赚钱,那就意味着没有太多的准确性。
因此,在这种情况下,您最好使用decimal
或money
。
参考: