我想找到一个数字的delta值
我试着用这个。我使用了Abs
函数。它适用于整数
但是,当我尝试执行以下操作时,
var gh = Math.Abs(3.223 - 6.243);
它返回3.0200000000000005
。但我期待3.02
为什么?如何获得3.02
?
答案 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.223
和6.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));