使用 C# Math.Abs​​ 返回值 - 没有得到预期的输出

Posted

技术标签:

【中文标题】使用 C# Math.Abs​​ 返回值 - 没有得到预期的输出【英文标题】:Working with C# Math.Abs return value- not getting expected output 【发布时间】:2012-12-18 09:03:31 【问题描述】:

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

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

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

【问题讨论】:

关于浮点精度的一些读物en.wikipedia.org/wiki/Floating_point What Every Computer Scientist Should Know About Floating-Point Arithmetic 【参考方案1】:

因为您使用的是浮点/双精度值,它们本质上不是 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); 

【讨论】:

【参考方案2】:

3.2236.243 都不能用二进制浮点数精确表示。你想要的3.02 的答案也不能完全代表。

如果你想要精确的十进制算术,你应该使用decimal 类型。例如:

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

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

有用的资源

What Every Computer Scientist Should Know About Floating-Point Arithmetic What is the exact value of a floating-point variable?

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));

祝你好运!

【讨论】:

这是个坏主意。不要混合浮点和十进制算术。决定使用哪一个并在那里进行整个计算。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

这是个坏主意。不要混合浮点和十进制算术。决定使用哪一个并在那里进行整个计算。

以上是关于使用 C# Math.Abs​​ 返回值 - 没有得到预期的输出的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.Math.abs方法

Math对象(min()-max()-ceil()-floor()-round()和abs())

js/Math

JavaScript中常用的Math方法

js-20170804-Math对象

Math常用的方法