2

以下问题在 ASP.NET MVC 4 中的 Web API 应用程序上运行,该应用程序由 Fluent NHibernate在SQL Server 2008 R2中连接。

所以我有这个表格可以存储一个十进制数,可以保存一个值到 15 个整数和 14 个小数位。数据库列被定义为decimal(29,14)映射属性Map((x) => x.Factor).Column("FACTOR").Precision(29).Scale(14).Not.Nullable()

该字段的数据应包含此掩码中的任何值999999999999999.99999999999999,但事实并非如此。该数字会导致OverflowException。我相信这是因为数量限制,在其参考资料中有所描述:C# and SQL Server

我真的不明白这个表示法-7.9x1028 to 7.9x1028(来自 C# 参考)或-10^38 +1 to 10^38 -1(来自 SQL Server 参考),但我认为限制数字的是 SQL Server 小数,因为错误发生在事务提交操作上。ViewModel 显示正确的数字。

为了接受应用程序值,我需要在表格列上设置什么精度/比例?

4

1 回答 1

2

我真的不明白这个符号,-7.9x1028 to 7.9x1028(来自 C# 参考)

我更喜欢十进制结构(MSDN)中的解释。

Decimal 值的二进制表示由 1 位符号、96 位整数和用于划分 96 位整数并指定它的哪一部分是小数部分的比例因子组成。比例因子是隐含的数字 10,指数范围从 0 到 28。因此,十进制值的二进制表示形式为 ((-2 96到 2 96 ) / 10 (0 到 28) ),其中-(2 96 -1) 等于 MinValue,2 96 -1 等于 MaxValue。

你的十进制数应该写成 9(重复 29 次)/ 10 14

问题是大于 9x10 28的 9(重复 29 次)太大而无法转换为 96 位整数表示(最大值是第一个定义的 7.9x10 28,您将在上面链接的备注)

事实上,如果你尝试写

十进制 d = 99999999999999999999999999999m;

您将收到一条错误消息,指出“常量值计算中的溢出”。

我想要记住的是: 您最多可以有 29 个有效数字,只要这些有效数字不构成大于 7.9x10 28的整数

写的时候好像没有报错

decimal d = 999999999999999.99999999999999m ;

但会发生一些舍入。使用SQLite数据库对您的问题运行一些测试,碰巧作为参数传递的数字是 1000000000000000.0000000000000,即 (29,13),不能转换为 (29,14)。

尝试在 (29,14) 列中插入 1000000000000000.0000000000000 会导致“将数字转换为数据类型数字的算术溢出错误”。

于 2013-10-22T08:43:09.243 回答