数据变化发生在单位转换中
本文关键字:单位 转换 变化 数据 | 更新日期: 2023-09-27 18:17:45
我正在做一个使用很多公式的计算项目。这些公式是为度量定义的,度量单位(UOM)包含很多常量。因此,如果您以公制单位给出任何数据(如kg,mm,km/h),它将给出结果。但是作为改进,我们需要引入一个可以接受英文UOM(如lb,in,mph)数据的特性。
现在我们尝试使用相同的公式,但它有很多常数是基于公制UOM定义的。因此计算值不匹配,无法基于英文UOM更改或重新定义规则引擎。这可能需要很长时间,需要很多审批等。我们不能改变公式上的任何东西。因此,我们将输入的英文UOM值转换为公制单位并执行计算。但是与预期的结果有一些偏差。
我认为这个问题可能是由于转换因素。例如:如果我把1kg (Metric UOM)
转换成English UOM (pound)
。它会在2.20462
附近电离。但是当我把它转换成Metric
时,我得到0.9999988107
。因此,在使用相同的数据进行计算时,最终的计算结果会有所不同。有什么好的方法来处理这个问题吗?谢谢你的建议。
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 kg = 2.20462 lb—1
2.20462 lb = 0.9999988107 kg—2
0.9999988107 kg = 2.20461999989109 lb—3
步骤1,我做了第一次从kg到lb的转换。在第2步,我做了从磅到公斤的重新转换。值不同。它不是1,而是0.9999988107
。如果我做一轮,我将得到1
,如果我继续在公式中的值。res =(重量* 10)+ 200 g
res= (1kg*10)+200g= 10.2kg—当Kg=1时Res = (0.9999988107kg*10)+200g= 10.199kg -这些变化将影响进一步的计算。
如果你有任何想法,请分享。
您遇到了浮点舍入问题。这是因为某些十进制实数不能精确地用二进制表示。例如,KG_LBS
的确切值不是2.205。这是2.2050000000000000710542735760100185871124267578125。因此,一旦你开始用它计算,你会得到很少的差异。
参见:浮点数学坏了吗?
您可以通过使用decimal
而不是double
来解决您的问题。