Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 变量之间的计算精度有问题_C#_Wpf_Double - Fatal编程技术网

C# 变量之间的计算精度有问题

C# 变量之间的计算精度有问题,c#,wpf,double,C#,Wpf,Double,我的代码有一些问题,我认为准确性有点差。我将从代码中取出变量声明,因此代码尽可能小: 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是一个输入的文本

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

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并没有为十进制重载,只对双精度运算有效。我提供了我在另一篇讨论十进制平方根主题的帖子中找到的代码:


您需要将
g
四舍五入到小数点后2位,才能在最终计算中得到119.74

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

我认为你的计算器错了。我自己做的,它是119.61如果你用9.8乘以b和g,你得到119.61。可以确认我也得到119.61。虽然这对于浮点数是正确的,并且有些数字不能正确表示,OP的问题不是输出错误,而是他计算出的预期答案不正确。输出的答案(119.61)是正确的——我自己刚刚检查过,评论中的其他人也检查过。我试过了,仍然得到了119.61。我现在在家里试过3种不同的计算器,每个人都给我119.74。5.15x2.37x9.81=119.74为什么其他人都得到119.61?我想你是对的。我以前在计算货币的程序中处理过这个问题,所以我想我会解释为什么如果你看的是精确的话,双倍是不好的。@ThomasEikjeGjerde啊,就是这样
(1.09+(0.41*(Math.Sqrt(50/5.15))
不等于
2.37
-它是
2.3675……
。您需要四舍五入到小数点后两位。我的计算器显示119.61029556,您在计算器上解决这个问题的方式有问题,或者您的计算器有问题。
g = Math.Round(1.09 + (0.41 * (Math.Sqrt(50 / b))), 2);