SQL SERVER Money乘以Float返回Float结果

SQL SERVER Money乘以Float返回Float结果,sql,sql-server-2012,Sql,Sql Server 2012,在阅读了大多数文章后,我的理解是,如果我们用多个数字字段来表示金钱,它应该会返还金钱 如果我的字段为INT,则此操作正常 ISNULL(POFTotal.Total * [Price],0) AS [Total Purchases PO ($)] 在上述POF中,总计为整数,价格为货币。在我的.Net应用程序中,它以货币(十进制)的形式返回结果。 但对于下面的例子,其中NFFTotal.Total是float,它在我的.Net应用程序中以float或double的形式返回结果 ISNULL(N

在阅读了大多数文章后,我的理解是,如果我们用多个数字字段来表示金钱,它应该会返还金钱

如果我的字段为INT,则此操作正常

ISNULL(POFTotal.Total * [Price],0) AS [Total Purchases PO ($)]
在上述POF中,总计为整数,价格为货币。在我的.Net应用程序中,它以货币(十进制)的形式返回结果。 但对于下面的例子,其中NFFTotal.Total是float,它在我的.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 ($)]
和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类型,您需要转换以使其与MONEY一起工作。

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

因此,如果我们看一下,我们会发现
浮动
的优先级高于
货币
,而货币的优先级又高于
整数
。这就是为什么在表达式中混合
int
money
时,会得到类型
money
的结果,以及为什么在表达式中混合
float
money
时,会得到
float

在阅读了大多数文章后,我的理解是,如果我们用多个数字字段来表示金钱,它应该会返还金钱

嗯,我不知道你读了哪些文章,但我想说的是,它们充其量也不可靠



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

如果你用浮点数乘以任何东西,你已经有麻烦了。转换没有帮助,因为数据已经损坏。正确的解决方案是将
NFFTotal.Total
类型更改为更适合货币相关操作的类型。