linq to sql странное поведение с плавающей точкой - PullRequest
1 голос
/ 30 ноября 2009

У меня проблема с двойным (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 Ответ

1 голос
/ 30 ноября 2009

Является ли theCategorie.TaxRate плавающей точкой? Если это так, вы назначаете поплавок в дабл. Дополнительные десятичные числа обусловлены более высокой точностью в двойном значении, поэтому ближайший к числу с плавающей точкой двойный 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, либо, если вы хотите сохранить его как число с плавающей точкой, вы можете привести его и округлить при вызове сохраненного процесса:

DataContext.UpdateCategory(theCategorie.Code, theCategorie.Description, Math.Round((double)theCategorie.TaxRate, 6), theCategorie.TaxCode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...