c# - 十进制超出范围异常

标签 c# .net sql-server decimal

在我的 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# 中的 floatdoubledecimal 类型,以及SQL Server 中的 float(n) 类型。在 float 中,顾名思义,您基本上可以改变小数点前后的位数。 (从技术上讲,您有固定数量的数字,即所谓的尾数,然后您可以用第二个数字(指数)移动小数点)

现在开始您的项目:在您的数据库中,您使用定点数,而在 C# 中,您使用 float 。因此,当你在 C# 中计算一些东西,并且你想存储到你的数据库中时,它总是从 float 转换为定点数。但是,如果您在 C# 中的数字不适合数据库中的十进制数字,则会出现超出范围的错误。

关于c# - 十进制超出范围异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828106/

相关文章:

sql-server - 索引超出范围 : JDBC SqlServer exception

c# - Javascript:将对象转换为字节数组并转换为字符串

c# - 为什么 Emit 比 Reflection 快

c# - "cast negative number to unsigned integer"这个习语是什么意思?

c# - 依赖属性是否实现享元模式?

c# - 如何使用 Visual Studio Code 创建 C# 项目?

c# - 当一个变量被关闭两次时,它存储在哪里?

sql - SQL 中基于下一条记录和上一条记录的复杂排序

c# - .NET TCP 套接字和 session

sql-server - 禁止重复列的 XML DML (Xpath) 查询。它应该在插入列之前测试它是否存在