变量之间的计算准确性有问题

本文关键字:准确性 有问题 计算 之间 变量 | 更新日期: 2023-09-27 18:35:33

我的代码有一些问题,我认为准确性有点偏差。我将从代码中取出变量的声明,因此代码尽可能小:

int a = Int32.Parse(tb_weight.Text);
double b = 0;
b = (a * 1.03) / 1000;
double g = 0;
g = (1.09 + (0.41 * (Math.Sqrt(50 / b))));
lbl_vertforce.Content = Math.Round((b * g * 9.81), 2);

因此,tb_weight是一个输入的文本框,假设输入是 5000,标签lbl_vertforce显示 119,61,根据我的计算器,它应该显示 119,74。这里有什么好动听的?

变量之间的计算准确性有问题

双精度不是 100% 精确,并且可以在最不常见的数字中变化。如果你想要精确的精度,你需要使用十进制类型,它具有更大的内存足迹,但设计得非常精确。不幸的是,Math.Sqrt 没有为十进制重载,只适用于双精度。我提供了我在另一篇讨论十进制平方根主题的帖子中找到的代码:在 C# 中对十进制数据类型执行数学运算?

public void YourCodeModifiedForDecimal()
{
int a = Int32.Parse(tb_weight.Text);
decimal b = 0;
b = (a* 1.03m) / 1000m;
decimal g = 0;
g = (1.09m + (0.41m * (Sqrt(50m / b))));
lbl_vertforce.Content = Math.Round((b* g * 9.81m), 2);
}
public static decimal Sqrt(decimal x, decimal? guess = null)
{
    var ourGuess = guess.GetValueOrDefault(x / 2m);
    var result = x / ourGuess;
    var average = (ourGuess + result) / 2m;
    if (average == ourGuess) // This checks for the maximum precision possible with a decimal.
        return average;
    else
        return Sqrt(x, average);
}
您需要

g四舍五入到小数点后 2 位才能在最终计算中获得 119.74。

g = Math.Round(1.09 + (0.41 * (Math.Sqrt(50 / b))), 2);