SQL SERVER Money乘以Float返回float结果

时间:2014-05-09 04:57:26

标签: sql sql-server-2012

在阅读了大部分文章之后,我的理解是,如果我们对MONEY有多个数字字段,它应该返回Money。

如果我的字段是INT,这可以正常工作。

ISNULL(POFTotal.Total * [Price],0) AS [Total Purchases PO ($)]

以上POF.Total是INT而Price是金钱。它在我的.Net应用程序中将结果返回为货币(十进制)。 但是对于下面的地方,NFFTotal.Total是浮点数,它会在我的.Net应用程序中将结果返回为float或double。

ISNULL(NFFTotal.Total * [Price],0) AS [Total NY COGS ($)]

我可以将它转换为下面的代码,但是想要理解为什么INT和FLOAT之间的区别在这里。

CONVERT(money,ISNULL(NFFTotal.Total * [Price],0)) AS [Total NY COGS ($)]

2 个答案:

答案 0 :(得分:1)

在很多语言 1 中,您实际上不允许混合您提供给运营商的数据类型。这些语言会发生什么,它们将定义数据类型优先规则,并使用这些规则来确定执行计算的“最佳”类型。然后,它会将较低优先级的类型转换为较高优先级类型,然后执行计算。

因此,如果我们查看precedence rules for SQL Server,我们会看到float的优先级高于money,而int的优先级高于int }。这就是为什么当你在表达式中混合使用moneymoney时,会得到float类型的结果,以及当你将moneyfloat混合在一起时的原因表达式,你得到{{1}}。

  

在阅读了大部分文章之后,我的理解是,如果我们对MONEY有多个数字字段,它应该返回Money。

好吧,我不知道你读了哪些文章,但我认为它们充其量是不可靠的。


1 这个答案首先是说“大多数语言”,但后来我意识到这是一个过时的评论。在现代语言中,特别是那些允许自定义运算符和运算符重载的语言,情况不一定如此。但没有人会指责T-SQL是一种现代语言。

答案 1 :(得分:0)

MONEY和INT是定点数据类型,而FLOAT是浮点数据类型。

    money      -922,337,203,685,477.5808 to 922,337,203,685,477.5807  8 bytes
    smallmoney -214,748.3648 to 214,748.3647                          4 bytes

所以,如果你使用

    NFFTotal.Total * [Price]

结果是float类型,你需要CONVERT才能使它与MONEY一起工作。