1

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

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

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

4

6 回答 6

7

因为您使用的是浮点/双精度值,它们本质上不是 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); 
于 2012-12-18T09:09:20.120 回答
3

二进制浮点数既不3.223也不完全可表示。6.243您想要的答案3.02也不完全可以表示。

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

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

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

有用的资源

于 2012-12-18T09:09:58.977 回答
2

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

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

于 2012-12-18T09:20:17.323 回答
1

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

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

祝你好运!

于 2012-12-18T09:07:27.043 回答
1

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

于 2012-12-18T09:08:50.097 回答
1

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

于 2012-12-18T09:11:58.760 回答