为了账号安全,请及时绑定邮箱和手机立即绑定

比较C#中的双值

比较C#中的双值

繁星淼淼 2019-07-09 15:06:59
比较C#中的双值我有一个double变量调用x..在密码里,x获取分配的值为0.1我在一个比较“如果”的语句中检查它x和0.1if (x==0.1){----}不幸的是,它没有进入if陈述我应该用Double或double?这背后的原因是什么?你能提出解决办法吗?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

这是一个标准的问题,因为计算机如何存储浮点值。在这里搜索“浮点问题”,你会发现大量的信息。

简而言之-浮动/双不能存储0.1准确地说。总是有点不对劲。

您可以尝试使用decimal在十进制表示法中存储数字的类型。因此0.1将是准确的代表。


你想知道原因:

浮动/双存储为二进制分数,而不是十进制分数。为了说明:

12.34在十进制表示法中(我们使用的)是指

1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2

计算机以相同的方式存储浮点数,除非它使用基。210.01手段

1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2

现在,您可能知道有一些数字不能完全用我们的十进制表示法来表示。例如,1/3在十进制表示法中0.3333333…..同样的事情发生在二进制表示法中,除了不能精确表示的数字是不同的。其中包括数字1/10..在二进制表示法中0.000110011001100….

由于二进制表示法不能精确地存储它,所以它是以舍入的方式存储的.这就是你的问题。


查看完整回答
反对 回复 2019-07-09
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

doubleDouble是一样的(double的别名Double),可以互换使用。

将一个双值与另一个值进行比较的问题是,双值是近似值,而不是精确值。所以当你x0.1它在现实中可能被储存为0.100000001或者类似的东西。

与其检查是否相等,不如检查差异是否小于定义的最小差(公差)。类似于:

if (Math.Abs(x - 0.1) < 0.0000001){
    ...}


查看完整回答
反对 回复 2019-07-09
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

你需要一个组合Math.Abs在……上面X-Y和一个value与之相比。

可以使用以下扩展方法

public static class DoubleExtensions
    {
        const double _3 = 0.001;
        const double _4 = 0.0001;
        const double _5 = 0.00001;
        const double _6 = 0.000001;
        const double _7 = 0.0000001;

        public static bool Equals3DigitPrecision(this double left, double right)
        {
            return Math.Abs(left - right) < _3;
        }

        public static bool Equals4DigitPrecision(this double left, double right)
        {
            return Math.Abs(left - right) < _4;
        }

        ...

因为很少在Double上调用方法,所以除了ToString我认为这是相当安全的延伸。

然后你可以比较xy喜欢

if(x.Equals4DigitPrecision(y))


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 420 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信