1

我正在做一个使用很多公式的计算项目。这些公式是为度量单位(UOM)定义的,其中包含许多常量。因此,如果您在公制 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 公斤 = 2.20462 磅 --1

2.20462 磅 = 0.9999988107 公斤 --2

0.9999988107 公斤 = 2.20461999989109 磅 --3

第 1 步,我做了第一次从 kg 到 lb 的转换。在第 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 -- 这些变化会影响进一步的计算。

如果您有任何减少这种情况的想法,请分享。

4

1 回答 1

3

您遇到了浮点舍入问题。发生这种情况是因为某些具有十进制表示的实数不能精确地以二进制表示。例如, 的确切值KG_LBS不是 2.205。它是 2.2050000000000000710542735760100185871124267578125。因此,一旦您开始使用它进行计算,您就会发现很小的差异。

请参阅:浮点数学是否损坏?

您也许可以通过使用decimal代替double.

于 2015-10-15T11:04:20.980 回答