linq to sql奇怪的浮动行为

时间:2009-11-30 01:50:23

标签: 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.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));
 }

这里的值是 19.6000003814697 。你看到奇怪的加十进制?这两个调用之间没有操作,为什么会出现这些小数?

1 个答案:

答案 0 :(得分:1)

theCategorie.TaxRate是浮点数吗?如果是这样,你将浮点数分配给double。额外的小数是由于double的精度更高,所以double最接近float的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());

作为一种解决方法,您可以将theCategorie.TaxRate的类型更改为double,或者如果您想将其保持为float,则可以将其转换为&amp;在调用存储过程时将其舍入:

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