C# linq到sql奇怪的浮点行为

C# linq到sql奇怪的浮点行为,c#,linq-to-sql,floating-point,C#,Linq To Sql,Floating Point,我对double(这里是TaxRate)有一个问题,它在通过函数时没有相同的值: 我首先调用一个函数 DataContext.UpdateCategory(theCategorie.Code, theCategorie.Description, theCategorie.TaxRate, theCategorie.TaxCode); 当我运行调试器时,TaxRate的值是19.6 然后,当我在dbml函数中放置一个停止点时,该函数被调用: [Function(Name="dbo.Update

我对double(这里是TaxRate)有一个问题,它在通过函数时没有相同的值:

我首先调用一个函数

DataContext.UpdateCategory(theCategorie.Code, theCategorie.Description, theCategorie.TaxRate, theCategorie.TaxCode);
当我运行调试器时,TaxRate的值是19.6

然后,当我在dbml函数中放置一个停止点时,该函数被调用:

 [Function(Name="dbo.UpdateCategory")]
 public int UpdateCategory([Parameter(Name="Code", DbType="VarChar(20)")] string code, [Parameter(Name="Description", DbType="NVarChar(512)")] string description, [Parameter(Name="TaxRate", DbType="Float")] System.Nullable<double> taxRate, [Parameter(Name="TaxCode", DbType="NChar(10)")] string taxCode)
 {
     IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), uNSPSC, description, taxRate, taxCode);
     return ((int)(result.ReturnValue));
 }
[函数(Name=“dbo.UpdateCategory”)]
public int UpdateCategory([Parameter(Name=“Code”,DbType=“VarChar(20)”)]字符串代码,[Parameter(Name=“Description”,DbType=“NVarChar(512)”)字符串描述,[Parameter(Name=“TaxRate”,DbType=“Float”)]系统。可为空的税率,[Parameter(Name=“TaxCode”,DbType=“NChar(10)”]字符串TaxCode)
{
IExecuteResult=this.ExecuteMethodCall(this,((MethodInfo)(MethodInfo.GetCurrentMethod())),uNSPSC,description,taxRate,taxCode);
返回((int)(result.ReturnValue));
}

此处的值为19.6000003814697。你看到那个奇怪的加小数了吗?这两个调用之间没有操作,所以为什么会出现这些小数?

分类税率是浮动的吗?如果是这样,则将浮点赋值为双精度。额外的小数是由于双精度更高,所以双精度最接近浮点的19.6

这篇文章的输出说明了这一点:

float f = 19.6F;
double d = f;
double d2 = 19.6D;

System.Diagnostics.Debug.WriteLine("Float: " + f.ToString());
System.Diagnostics.Debug.WriteLine("Double from float: " + d.ToString());
System.Diagnostics.Debug.WriteLine("Double: " + d2.ToString());
作为一种解决方法,您可以将categorie.TaxRate的类型更改为double,或者如果希望将其保留为float,则可以在调用存储过程时对其进行强制转换(&R):

DataContext.UpdateCategory(theCategorie.Code, theCategorie.Description, Math.Round((double)theCategorie.TaxRate, 6), theCategorie.TaxCode);

分类税率是浮动的吗?如果是这样,则将浮点赋值为双精度。额外的小数是由于双精度更高,所以双精度最接近浮点的19.6

这篇文章的输出说明了这一点:

float f = 19.6F;
double d = f;
double d2 = 19.6D;

System.Diagnostics.Debug.WriteLine("Float: " + f.ToString());
System.Diagnostics.Debug.WriteLine("Double from float: " + d.ToString());
System.Diagnostics.Debug.WriteLine("Double: " + d2.ToString());
作为一种解决方法,您可以将categorie.TaxRate的类型更改为double,或者如果希望将其保留为float,则可以在调用存储过程时对其进行强制转换(&R):

DataContext.UpdateCategory(theCategorie.Code, theCategorie.Description, Math.Round((double)theCategorie.TaxRate, 6), theCategorie.TaxCode);

1) 2)3)这已经被打死了。阅读每一位计算机科学家都应该知道的关于浮点()的知识,在处理货币数字时改为十进制类型,然后继续。是的,但问题来自dbml生成,它在存储过程参数(double)和类属性(float)之间不使用相同的类型(即使两者都是float-SqlType)将SQL类型更改为decimal。是的,这是我根据您的建议所做的,但我坚持认为dbml生成存在问题1)2)3)这已经被打败了。阅读每一位计算机科学家都应该知道的关于浮点()的知识,在处理货币数字时改为十进制类型,然后继续。是的,但问题来自dbml生成,它在存储过程参数(double)和类属性(float)之间不使用相同的类型(即使两者都是float-SqlType)将SQL类型更改为十进制。是的,这是由于我的建议而完成的,但是我坚持在dML生成中存在一个问题。您应该认真考虑将类型更改为十进制类型,因为您处理的是货币数字。“杰森,请参阅我的评论,您应该认真考虑将类型更改为十进制T。请键入,因为您处理的是货币数据。@Jason请参阅我对您上述评论的评论