我想找到一个数字的增量值。
我试着用这个。我用Abs
函数。它适用于整数。
但是当我尝试执行以下操作时,
var gh = Math.Abs(3.223 - 6.243);
它返回3.0200000000000005
。但我期待 3.02
。
为什么?如何获得3.02
?
我想找到一个数字的增量值。
我试着用这个。我用Abs
函数。它适用于整数。
但是当我尝试执行以下操作时,
var gh = Math.Abs(3.223 - 6.243);
它返回3.0200000000000005
。但我期待 3.02
。
为什么?如何获得3.02
?
因为您使用的是浮点/双精度值,它们本质上不是 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);
二进制浮点数既不3.223
也不完全可表示。6.243
您想要的答案3.02
也不完全可以表示。
如果你想要精确的十进制算术,你应该使用decimal
类型。例如:
var gh = Math.Abs(3.223m - 6.243m);
这将导致gh
type decimal
,并具有您想要的确切值。文字上的m
后缀用于表示 type 的值decimal
。
有用的资源
您是否需要像这样显示数字,或者您想将其用于进一步计算?
为了显示它,您可以使用字符串格式。如果您将其用于进一步计算,您应该将其保留为这样,并在需要显示数字的地方应用截断。
我得到了正确的价值。尝试将其转换为Decimal
,也许你会得到正确的精度:
decimal gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));
祝你好运!
你可以试试这个: var sgh= gh.ToString("0.00", CultureInfo.CurrentCulture);
这取决于你想要多少位数,如果你想要小数,那么 var gh = Convert.ToDecimal(Math.Abs(3.223 - 6.243));