使用 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.223
和 6.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 返回值 - 没有得到预期的输出的主要内容,如果未能解决你的问题,请参考以下文章