我想将货币数据类型转换为小数,因为我想将结果记录到小数点后 8 位。
例如,在货币汇率表中,我看到存储为 2871047428.20 的汇率作为货币数据类型;使用 Microsoft SQL Management Studio,我想将其除以 10000000 以获得结果 287.10474282;但是我实际得到的结果是 287.1047。
我相信我只得到小数点后 4 位的原因是因为它是货币数据类型,因此我认为前进的方向是将其转换为十进制数据类型......
这里比较左栏是十进制值,右栏是计算出来的货币值:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000
另请参阅堆栈溢出:
SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
你们都遇到了小数除法的怪事这是我对另一个线程 T-SQL 小数除法精度的回答
如果您使用 10000000.0 ,由于数据类型优先级,您也可能有隐式浮点转换
DECLARE @money AS money
SET @money = 2871047428.20
--Oddities
SELECT
CAST(@money AS decimal(34,8)) / 10000000,
CAST(@money AS decimal(34,8)) / 10000000.0,
CAST(@money AS decimal(34,8)) / 10000000.00,
CAST(@money AS decimal(34,8)) / 10000000.000,
CAST(@money AS decimal(34,8)) / 10000000.0000
--Should be safe. My brain hurts if I work through p and s
SELECT
CAST(@money AS decimal(38,8)) / CAST(10000000 AS decimal(8,0))
splattne 的回答几乎是正确的,除了两个小改动:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,6)) / 10000000.0, @money / 10000000.0
这将给出正确答案:287.10474282。我所做的是更改精度值并将“.0”添加到除法值。
现在唯一让我感到困惑的是我必须将值转换为小数(34,6)而不是预期的小数(34,8)。
因此,我以另一种方式编写了查询,这对我来说更有意义:
DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST((@money / 10000000.0) AS decimal(34,8)), @money / 10000000.0
请查看哪一个适合您。