货币类型的算术溢出错误

Posted

技术标签:

【中文标题】货币类型的算术溢出错误【英文标题】:Arithmetic overflow error for type money 【发布时间】:2013-08-13 13:52:46 【问题描述】:

我收到金钱类型的 sql 异常(算术溢出错误)。如何在 c# 中设置金钱的最小值和最大值。我的 sql 类型是金钱,而 C# 数据类型是 double。货币范围是 (-922,337,203,685,477.5808) 到 (922,337,203,685,477.5807)。

【问题讨论】:

相关:***.com/questions/693372/…,***.com/questions/1008826/… 在c#代码中使用十进制 money 映射到double 是个坏主意——当然decimal 会是更好的选择吗? 哪行代码实际上导致了异常?你是否传递了Double.MaxValue之类的东西? 【参考方案1】:

您应该使用decimal 进行资金操作。 Decimal - 特定类型,这是您在资金操纵方面所需要的。因此,如果获得精确正确的结果对您很重要 - 请使用它。否则 - 双倍没问题。


double (System.Double) ±5.0 x 10-324 到 ±1.7 x 10308,有效数字为 15 或 16 个十进制(System.Decimal)±1.0 x 10-28 到 ±7.9 x 1028,有效数字为 28 或 29

【讨论】:

【参考方案2】:

不要使用双精度 - 在 C# 中使用小数表示货币。

【讨论】:

【参考方案3】:

请改用decimal;如果您特别想设置最小/最大值,那么:

const decimal Min = -922337203685477.5808M, Max = 922337203685477.5807M;

就个人而言,我建议不要过多地混淆最小值/最大值。在这些情况下,null 可能比实际值更清晰。

另外,还有System.Data.SqlTypes.SqlMoney 类型,它有MinValueMaxValue - 不过,我个人会尽量避免将实现细节(例如SqlMoney)泄漏到您的域模型中。

【讨论】:

以上是关于货币类型的算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

smallint 的算术溢出错误——但数据类型是 int?

将 expression 转换为数据类型 datetime 时出现算术溢出错误。

Azure ADF 错误算术溢出错误将表达式转换为数据类型 int

为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?

将expression转化为数据类型int时发生算术溢出错误

将 numeric 转换为数据类型 numeric 时出现算术溢出错误