比较C#中的双值

比较C#中的双值

我有一个double变量调用x..在密码里,x获取分配的值为0.1我在一个比较“如果”的语句中检查它x0.1

if (x==0.1){----}

不幸的是,它没有进入if陈述

  1. 我应该用Doubledouble?

  2. 这背后的原因是什么?你能提出解决办法吗?


繁星淼淼
浏览 421回答 3
3回答

喵喵时光机

这是一个标准的问题,因为计算机如何存储浮点值。在这里搜索“浮点问题”,你会发现大量的信息。简而言之-浮动/双不能存储0.1准确地说。总是有点不对劲。您可以尝试使用decimal在十进制表示法中存储数字的类型。因此0.1将是准确的代表。你想知道原因:浮动/双存储为二进制分数,而不是十进制分数。为了说明:12.34在十进制表示法中(我们使用的)是指1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2计算机以相同的方式存储浮点数,除非它使用基。2: 10.01手段1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2现在,您可能知道有一些数字不能完全用我们的十进制表示法来表示。例如,1/3在十进制表示法中0.3333333…..同样的事情发生在二进制表示法中,除了不能精确表示的数字是不同的。其中包括数字1/10..在二进制表示法中0.000110011001100….由于二进制表示法不能精确地存储它,所以它是以舍入的方式存储的.这就是你的问题。

明月笑刀无情

double和Double是一样的(double的别名Double),可以互换使用。将一个双值与另一个值进行比较的问题是,双值是近似值,而不是精确值。所以当你x到0.1它在现实中可能被储存为0.100000001或者类似的东西。与其检查是否相等,不如检查差异是否小于定义的最小差(公差)。类似于:if&nbsp;(Math.Abs(x&nbsp;-&nbsp;0.1)&nbsp;<&nbsp;0.0000001){ &nbsp;&nbsp;&nbsp;&nbsp;...}

料青山看我应如是

你需要一个组合Math.Abs在……上面X-Y和一个value与之相比。可以使用以下扩展方法public&nbsp;static&nbsp;class&nbsp;DoubleExtensions &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;_3&nbsp;=&nbsp;0.001; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;_4&nbsp;=&nbsp;0.0001; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;_5&nbsp;=&nbsp;0.00001; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;_6&nbsp;=&nbsp;0.000001; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;double&nbsp;_7&nbsp;=&nbsp;0.0000001; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;bool&nbsp;Equals3DigitPrecision(this&nbsp;double&nbsp;left,&nbsp;double&nbsp;right) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Math.Abs(left&nbsp;-&nbsp;right)&nbsp;<&nbsp;_3; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;bool&nbsp;Equals4DigitPrecision(this&nbsp;double&nbsp;left,&nbsp;double&nbsp;right) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Math.Abs(left&nbsp;-&nbsp;right)&nbsp;<&nbsp;_4; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...因为很少在Double上调用方法,所以除了ToString我认为这是相当安全的延伸。然后你可以比较x和y喜欢if(x.Equals4DigitPrecision(y))
打开App,查看更多内容
随时随地看视频慕课网APP