在我的C#应用程序中,我试图将十进制价格保存到SQL Server表中。列类型为21800
,未定义总数。
没有折扣计算,一切正常。
但是当我运行一些计算时,我得到的最终值为"Parameter value '218000/00000000000000' is out of range."
,并且在尝试保存时出现以下错误。
myValue.ToString()
我不明白额外的零来自哪里!我唯一知道的是218000/00000000000000
我也得到了21800
!
据我所知,浮点后的数字是由计算引起的。但无论他们做什么,我看到它时的价值都是218000/00000000000000
。为什么要保存while (alreadyread != 5)
?为什么它关注零呢?
为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:4)
存储十进制数有两种方法:
定点:这是您在SQL Server项目中定义的内容。您定义了decimal (19,4)
,这意味着总共19位数字和小数点后4位数字。如果您定义了这样的类型,则每个数字始终在小数点后面有4位数字;而且,您不能存储小数点后超过4位数的数字。 请注意,C#中没有相应的固定点!
浮点:这些是C#中的float
,double
和decimal
类型,以及SQL中的类型float(n)
服务器。在浮点数中,正如名称所示,您基本上可以改变小数点前后的位数。 (从技术上讲,你有一个固定的位数,即所谓的尾数,然后你可以用第二个数字,指数移动小数点)
现在开始您的项目:在您的数据库中,您使用固定点,而在C#中,您有浮点。因此,当您在C#中计算某些内容并且想要存储到数据库中时,它始终会从浮点转换为固定点。但是,如果C#中的数字不符合数据库中的十进制数,则会出现超出范围的错误。
答案 1 :(得分:2)
我必须在SQL表中指定我的十进制列的总位数(我将其设置为decimal (19, 4)
)。
此外,我的C#表示字段也需要具有正确的精度计数。
我仍然不知道额外的零和SQL为何关心它们。任何解释都表示赞赏。