首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_double.Equals(_float);

_double.Equals(_float);
EN

Stack Overflow用户
提问于 2016-06-07 16:52:10
回答 2查看 101关注 0票数 4

样本代码:

代码语言:javascript
复制
double d = 0;
float  f = 0;

// Dump() prints result in LinqPad application

(f == d).Dump(); // 1) true
(d == f).Dump(); // 2) true

(f.Equals(d)).Dump(); // 3) false
(d.Equals(f)).Dump(); // 4) true

1)按预期返回true

2)与上述相同

3) false --因为我们使用Equals(object),它在内部检查:

代码语言:javascript
复制
  public override bool Equals(Object obj) {
        if (!(obj is Single)) {
            return false;
        }
        ...

4)是真的?为什么?

代码语言:javascript
复制
public override bool Equals(Object obj) {
        if (!(obj is Double)) {
            return false;
        }

float怎么能通过这个if警卫?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-07 16:59:36

调用的函数是公共bool等于(双obj) (而不是public override bool Equals(Object obj)),它是:

代码语言:javascript
复制
public bool Equals(Double obj)
{
    if (obj == m_value) {
        return true;
    }
    return IsNaN(obj) && IsNaN(m_value);
}

多亏了floatDouble的隐式转换

票数 3
EN

Stack Overflow用户

发布于 2016-06-07 16:57:40

事实并非如此。

您在案例4中使用的重载是double.Equals(double obj)。这是因为有一个从floatdouble的隐式转换。

在案例3中,不存在从doublefloat的隐式转换,因为它可能导致精度的损失。在本例中,double将被装箱,您将使用object.Equals

您可以通过将object.Equals转换为object来显示实际结果:

代码语言:javascript
复制
d.Equals((object)f)).Dump(); // this will be false

这把小提琴

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37685039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档