十进制超出范围异常

时间:2015-06-14 10:05:28

标签: c# .net sql-server decimal

在我的C#应用​​程序中,我试图将十进制价格保存到SQL Server表中。列类型为21800,未定义总数。

没有折扣计算,一切正常。

但是当我运行一些计算时,我得到的最终值为"Parameter value '218000/00000000000000' is out of range." ,并且在尝试保存时出现以下错误。

myValue.ToString()

我不明白额外的零来自哪里!我唯一知道的是218000/00000000000000我也得到了21800

据我所知,浮点后的数字是由计算引起的。但无论他们做什么,我看到它时的价值都是218000/00000000000000。为什么要保存while (alreadyread != 5)?为什么它关注零呢?

为什么会发生这种情况以及如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

存储十进制数有两种方法:

  • 定点:这是您在SQL Server项目中定义的内容。您定义了decimal (19,4),这意味着总共19位数字和小数点后4位数字。如果您定义了这样的类型,则每个数字始终在小数点后面有4位数字;而且,您不能存储小数点后超过4位数的数字。 请注意,C#中没有相应的固定点!

  • 浮点:这些是C#中的floatdoubledecimal类型,以及SQL中的类型float(n)服务器。在浮点数中,正如名称所示,您基本上可以改变小数点前后的位数。 (从技术上讲,你有一个固定的位数,即所谓的尾数,然后你可以用第二个数字,指数移动小数点)

现在开始您的项目:在您的数据库中,您使用固定点,而在C#中,您有浮点。因此,当您在C#中计算某些内容并且想要存储到数据库中时,它始终会从浮点转换为固定点。但是,如果C#中的数字不符合数据库中的十进制数,则会出现超出范围的错误。

答案 1 :(得分:2)

我必须在SQL表中指定我的十进制列的总位数(我将其设置为decimal (19, 4))。

此外,我的C#表示字段也需要具有正确的精度计数。

我仍然不知道额外的零和SQL为何关心它们。任何解释都表示赞赏。