小数超出范围异常

本文关键字:异常 范围 小数 | 更新日期: 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# 中的 floatdoubledecimal 类型,以及 SQL Server 中的 float(n) 类型。在浮点中,顾名思义,您基本上可以改变小数点前后的位数。(从技术上讲,你有一个固定数量的数字,即所谓的尾数,然后你可以用第二个数字(指数)移动小数点)

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

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

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

我仍然不知道额外的零以及为什么SQL关心它们。任何解释都值得赞赏。