什么是.NET十进制到SQL Server十进制的良好映射?

时间:2010-06-30 18:57:17

标签: .net sql-server decimal

我不得不将一些C#代码与SQL Server连接起来,并且我希望在数据库中存储一个与C#代码一样多的精度。我使用.NET的decimal类型之一作为值。我将在SQL Server中使用什么数据类型/精度来获取此值?

我知道SQL Server decimal类型最适合我需要的类型。我的问题是我使用什么规模和精度,以便它匹配.NET的decimal类型?

6 个答案:

答案 0 :(得分:23)

Fluent nHibernate将System.Decimal映射为

decimal(19, 5)

答案 1 :(得分:12)

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

但是,您的问题似乎是将.NET十进制类型映射到SQL Server十进制类型。不幸的是,这不是直截了当的。 SQL Server十进制数以最大精度覆盖-10 38 +1到10 38 -1的范围。然而,在.NET中,它可以覆盖从±10 -28 到±7.9×10 28 的任何地方,具体取决于数量。

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

简而言之,为了您的目的,您需要确定十进制值的有效范围,并确保您的程序和数据库都可以处理它。无论如何你需要为你的程序做这件事(如果你把10 -28 和7.9×10 28 之类的值混合在一起,你无论如何都不能依赖十进制类型)。

答案 2 :(得分:4)

This chart may help you.

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

答案 3 :(得分:1)

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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#的十进制数,我认为十进制(19,4)就足够了。