数据变化发生在单位转换中

本文关键字:单位 转换 变化 数据 | 更新日期: 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。因此,在使用相同的数据进行计算时,最终的计算结果会有所不同。有什么好的方法来处理这个问题吗?谢谢你的建议。

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 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来解决您的问题。