c# - 数据变化发生在单位换算中

标签 c# .net logic data-conversion unit-conversion

我正在从事一个使用大量公式的计算项目。这些公式是为指标定义的 计量单位(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 步中,我做了从磅到公斤的重新转换。值(value)不同。 它不是 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 来解决您的问题。

关于c# - 数据变化发生在单位换算中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146661/

相关文章:

c++ - 与重置的计数器相比

c# - 关于在 Blazor 中使用 ValueTask 的 CA2012 警告。如何在 Blazor 中正确实现 "fire and forget"?

c# - 用于 Azure 存储托管文档的 Microsoft Office Web 查看器

c# - 你如何制作一个通用的通用工厂?

.net - 我可以创建一个反向引用匹配相反情况的正则表达式吗

javascript - 三元运算符?在 Javascript 中从预期向后解析

C# 转换字符串以用于逻辑条件

java - Unity - AndroidJavaObject.来自另一个线程的调用

c# - 如何从字符串中解析日期?

c# - 如何使用 Azure Mobile 的 .NET 客户端获取新插入项目的 Id 字段