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