繁体   English   中英

SQL SERVER Money与Float乘以返回浮点结果

[英]SQL SERVER Money multiplies with Float returns float result

在阅读了大多数文章之后,我的理解是,如果我们对MONEY设置多个数字字段,它将返回Money。

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

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

在上面的POF中,Total是INT,Price是货币。 它在我的.Net应用程序中以Currency(Decimal)返回结果。 但对于下面的NFFTotal.Total为float的情况,它在我的.Net应用程序中以flo​​at或double的形式返回结果。

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

我可以将其转换为下面的代码,但想了解为什么INT和FLOAT之间的区别。

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

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

因此,如果我们查看SQL Server优先级规则 ,则会发现float的优先级高于money优先级,而money优先级高于int优先级。 因此,当在表达式中混合intmoney时,会得到money类型的结果;为什么在表达式中混合floatmoney时会得到float

在阅读了大多数文章之后,我的理解是,如果我们对MONEY设置多个数字字段,它将返回Money。

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


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

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]

结果是浮点类型,您需要转换才能使其与MONEY一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM