货币类型的算术溢出错误
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
类型,它有MinValue
和MaxValue
- 不过,我个人会尽量避免将实现细节(例如SqlMoney
)泄漏到您的域模型中。
【讨论】:
以上是关于货币类型的算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章
将 expression 转换为数据类型 datetime 时出现算术溢出错误。
Azure ADF 错误算术溢出错误将表达式转换为数据类型 int
为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?