使用C#Math.Abs​​返回值 - 未获得预期输出

时间:2012-12-18 09:03:31

标签: c# visual-studio-2010 absolute-value

我想找到一个数字的delta值 我试着用这个。我使用了Abs函数。它适用于整数 但是,当我尝试执行以下操作时,

var gh = Math.Abs(3.223 - 6.243);  

它返回3.0200000000000005。但我期待3.02 为什么?如何获得3.02

6 个答案:

答案 0 :(得分:7)

因为你使用的是float / double值,它们本身并不是100%精确的(这是由于它们的二进制表示)。例如,您甚至不能使用浮点数精确0.1,因为它的二进制表示是周期性的1.(1001)。这是一篇关于此事的非常完整的文章: What Every Computer Scientist Should Know About Floating-Point Arithmetic

Tl; dr解决方案是使用decimal进行精确的十进制算术运算

var gh = Math.Abs(3.223m - 6.243m); 

答案 1 :(得分:3)

3.2236.243都不能在二进制浮点中完全表示。您对3.02的期望答案也不完全可以表示。

如果您需要精确的十进制算术,则应使用decimal类型。例如:

var gh = Math.Abs(3.223m - 6.243m);  

这将导致gh属于decimal类型,并具有您想要的确切值。文字的m后缀用于表示decimal类型的值。

有用资源

答案 2 :(得分:2)

您是否需要显示这样的数字,或者您想将其用于进一步的计算?

要显示它,您可以使用字符串格式。如果你将它用于进一步的计算,你应该保留它,并在你需要显示数字的地方应用截断。

答案 3 :(得分:1)

我得到了正确的价值。尝试将其转换为Decimal,也许您将获得正确的精确度:

decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));
祝你好运!

答案 4 :(得分:1)

你可以尝试这个:     var sgh = gh.ToString(“0.00”,CultureInfo.CurrentCulture);

答案 5 :(得分:1)

它取决于你想拥有多少位数,如果你想要小数,那么 var gh = Convert.ToDecimal(Math.Abs​​(3.223 - 6.243));