在我的 C# 应用程序中,我试图将小数价格保存到 SQL Server 表中。列类型为 decimal
,未定义总位数。
没有折扣计算,一切正常。
但是当我运行一些计算时,我得到了 21800
的最终值,并且在尝试保存它时出现以下错误。
"Parameter value '218000/00000000000000' is out of range."
我不明白多余的零是从哪里来的!我唯一知道的是 myValue.ToString()
我也得到 218000/00000000000000
!
我明白 float 后面的数字是计算造成的。但是无论他们做什么,我看的时候都是21800
。为什么要尝试保存 218000/00000000000000
?为什么它会关心零?
知道为什么会发生这种情况以及如何解决它吗?
最佳答案
有两种存储十进制数的方法:
定点:这是您在 SQL Server 项目中定义的。你定义了
decimal(19,4)
,意思是一共19位,小数点后4位。如果你定义了这样一个类型,那么每个数字总是小数点后有4位;此外,您不能存储小数点后超过 4 位的数字。 请注意,在 C# 中没有与不动点等效的东西!float :这些是 C# 中的
float
、double
和decimal
类型,以及SQL Server 中的float(n)
类型。在 float 中,顾名思义,您基本上可以改变小数点前后的位数。 (从技术上讲,您有固定数量的数字,即所谓的尾数,然后您可以用第二个数字(指数)移动小数点)
现在开始您的项目:在您的数据库中,您使用定点数,而在 C# 中,您使用 float 。因此,当你在 C# 中计算一些东西,并且你想存储到你的数据库中时,它总是从 float 转换为定点数。但是,如果您在 C# 中的数字不适合数据库中的十进制数字,则会出现超出范围的错误。
关于c# - 十进制超出范围异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828106/