10

我想将货币数据类型转换为小数,因为我想将结果记录到小数点后 8 位。

例如,在货币汇率表中,我看到存储为 2871047428.20 的汇率作为货币数据类型;使用 Microsoft SQL Management Studio,我想将其除以 10000000 以获得结果 287.10474282;但是我实际得到的结果是 287.1047。

我相信我只得到小数点后 4 位的原因是因为它是货币数据类型,因此我认为前进的方向是将其转换为十进制数据类型......

4

4 回答 4

9

这里比较左栏是十进制值,右栏是计算出来的货币值:

DECLARE @money AS money
SET @money = 2871047428.20
SELECT CAST(@money AS decimal(34,4)) / 10000000, @money / 10000000

另请参阅堆栈溢出:

于 2009-03-12T12:19:22.857 回答
1
    SELECT CAST(currency_rate AS decimal) / 10000000 FROM ...
于 2009-03-12T11:58:25.233 回答
1

你们都遇到了小数除法的怪事这是我对另一个线程 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))
于 2009-03-13T08:59:47.373 回答
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

请查看哪一个适合您。

于 2009-03-12T16:15:21.703 回答