【问题标题】:What is a good mapping of .NET decimal to SQL Server decimal?.NET 十进制到 SQL Server 十进制的良好映射是什么?
【发布时间】:2011-03-10 07:24:07
【问题描述】:

我必须将一些 C# 代码与 SQL Server 交互,并且我希望在数据库中存储值时具有与 C# 代码一样高的精度。我使用 .NET 的 decimal 类型之一作为值。我将在 SQL Server 中为这个值使用什么数据类型/精度?

我知道 SQL Server decimal 类型最有可能满足我的需求。不过我的问题是我使用什么比例和精度才能匹配 .NET 的 decimal 类型?

【问题讨论】:

  • +1 好问题! 8 个月前我打算在 SO 上问同样的问题,但我完全忘记了!

标签: .net sql-server decimal


【解决方案1】:

Fluent nHibernate 将 System.Decimal 映射为

decimal(19, 5)

【讨论】:

  • 顺便说一句,钱是十进制的(19,4)
【解决方案2】:

您可以使用 SQL Server decimal 类型 (documentation here)。这允许您为数据库中的数字指定精度和小数位数,您可以将其设置为与 C# 代码中的相同。

但是,您的问题似乎是关于将 .NET 十进制类型映射到 SQL Server 十进制类型。不幸的是,这并不简单。 SQL Server 十进制以最大精度涵盖从 -1038+1 到 1038-1 的范围。然而,在 .NET 中,它可以覆盖从 ±10−28 到 ±7.9×1028 的任何位置,具体取决于数量。

原因是,在内部,.NET 对小数的处理与浮点数非常相似——它将其存储为一对数字、一个尾数和一个指数。如果你有一个特别大的尾数,你会失去一些精度。从本质上讲,.NET 允许您混合具有高比例和低比例的数字; SQL Server 要求您提前为给定列选择它。

简而言之,您需要根据自己的目的确定十进制值的有效范围,并确保您的程序和数据库都可以处理它。无论如何,您都需要为您的程序执行此操作(如果您将 10−28 与 7.9×1028 之类的值混合,则无论如何都不能依赖小数类型)。

【讨论】:

  • 我要问的是对于 SQL Server,我应该为 precisionscale 使用什么值,以便它与 .NET decimal 一样精确? (注意 1.25 和 1.250 问题与我们无关)
【解决方案3】:

This chart may help you.

SQL Server 中数字和小数的最大精度为 38 (see here)。

【讨论】:

  • 是的,.NET Decimal to SQL Decimal 应该没问题
  • SQL Server 的decimal 的精度是多少?看来默认是(18,0),这绝对不是我想要的。
【解决方案4】:

【讨论】:

【解决方案5】:

C# 的 decimal 类型大小为 128 位(16 字节)。在 SQL Server 中,如果您指定 20-28 之间的精度,它将使用 13 个字节进行存储。如果您指定 29-38 之间的精度,它将使用 17 个字节进行存储。为了让您的数据库能够存储 .NET 十进制类型的所有可能值范围,您必须使用 SQL Server 的 decimal 类型,最小精度为 29。因为 29 到 38 之间的任何精度都将使用相同数量的存储字节数 (17),选择 38 作为精度符合您的利益。

C# 的小数类型允许您在没有事先说明的情况下使用它,您将在小数分隔符之前使用精度的哪一部分以及在小数分隔符之后使用哪一部分。您在 SQL Server 中没有这种奢侈。比例的决定完全取决于您的要求,但您必须做出决定,因为如果您不指定比例,默认情况下它将为 0,您将根本无法存储浮点数。

如果您必须确保能够存储整个 .NET 十进制范围,上述情况属实。

如果您在应用程序中使用 C# 的小数,我认为 Decimal(19, 4) 就足够了。

【讨论】:

    【解决方案6】:

    简短的回答是,C# 十进制是一个 128 位浮点精度数,它在 Sql Server 中没有完全等效的数字。

    可能在未来的 Sql Server 版本中,Microsoft 将匹配其产品并支持 128 位浮点精度数的直接 [clr / c# 十进制等效],以直接在其数据库服务器上持久化。

    在处理非常大和非常小的数量时,我遇到了这个分析问题。就我而言,我的解决方案中的所有比较数量都在 [c# double / sql float] 可以处理的 64 位范围内。因此,我选择在处理数量时使用 [c# double / sql float],在处理我的解决方案的财务部分时选择使用 [c# decimal / sql money]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2011-12-09
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多