我正在一个使用很多公式的计算项目中。这些公式是为度量标准定义的。度量单位(UOM)包含许多常量。因此,如果您以公制UOM提供任何数据(例如kg,mm,km / h),它将得到结果。但是,作为增强功能,我们需要引入一个功能,该功能可以接受英语UOM中的数据(例如lb,in,mph)。
现在我们尝试使用相同的公式,但是它具有许多基于Metric UOM定义的常数。因此,计算出的值不匹配,并且无法基于英语UOM更改或重新定义规则引擎。这可能需要很长时间,并且需要大量批准等。我们无法更改公式中的任何内容。
因此,我们将输入的英语UOM值转换为公制单位并执行计算。但是与预期结果有些偏差。
我认为问题可能是由于会话因素造成的。例如:如果我将1kg (Metric UOM)
转换为English UOM (pound)
。它将给出2.20462
。但是当我再次将其转换为Metric
时,我得到的是0.9999988107
。因此,使用相同数据执行计算时,最终计算结果将有所不同。有什么好的方法可以处理这一问题。
预先感谢您的任何想法。
C#代码
public const double KG_LBS = 2.205;
public const double LBS_KG = (1/KG_LBS);
static double ConvertKgsToLbs(string strInputValue, bool boolRoundWholeNum = false)
{
double dblInputValue = Convert.ToDouble(strInputValue);
double dblResult = dblInputValue * KG_LBS;
if (boolRoundWholeNum == true) dblResult = dblResult.WholeNumberRoundOff();
return dblResult;
}
static double ConvertLbsToKgs(string strInputValue, bool boolRoundWholeNum = false)
{
double dblInputValue = Convert.ToDouble(strInputValue);
double dblResult = dblInputValue * LBS_KG;
if (boolRoundWholeNum == true) dblResult = dblResult.WholeNumberRoundOff();
return dblResult;
}
这样会发生计算错误。
1公斤= 2.20462磅--1
2.20462磅= 0.9999988107公斤--2
0.9999988107公斤= 2.20461999989109磅--3
步骤1,我进行了从公斤到磅的第一次转换。
在步骤2中,我确实从lb转换为kg。该值是不同的。
它不是1,而是其
0.9999988107
。如果我进行一轮回合,则我将得到
1
如果我使用公式中的值。res =(重量* 10)+ 200g
res =(1kg * 10)+ 200g = 10.2kg-当Kg = 1时
res =(0.9999988107kg * 10)+ 200g = 10.199kg-这些更改将影响进一步的计算。
如果您有任何减少此想法,请分享。
最佳答案
您遇到了浮点舍入问题。发生这种情况是因为某些带有十进制表示形式的实数不能完全用二进制表示。
例如,KG_LBS
的确切值不是2.205。是2.2050000000000000710542735760100185871124267578125。因此,一旦开始使用它进行计算,您将不会有太多差异。
参见:Is floating point math broken?
通过使用decimal
而不是double
,您也许可以解决您的问题。