【问题标题】:== between float and decimal in C#== 在 C# 中的浮点数和小数之间
【发布时间】:2021-03-03 03:51:11
【问题描述】:
static void Main()
{
     int a=10;
     Console.WriteLine(Convert.ToSingle(a)==Convert.ToDecimal(a));
}

为什么这段代码会报错

== 不能应用于浮点和小数类型的操作数

即使两个转换语句都返回 10?

【问题讨论】:

  • John 对代码进行了更改。现在还好吗?
  • 看起来它现在应该会产生您的错误而没有其他不相关的错误,所以是的! :)

标签: c# floating-point decimal


【解决方案1】:

如下所示。

bool Compare<T>(T x, T y) where T : class
{
    ...
}

所以xy 应该是相同的数据类型。那么只有它可以比较。十进制是 128 位,单是 32 位。

十进制为Decimal floating point,双精度为Binary floating point

【讨论】:

  • 但是如果您尝试 ToSingle() 和 ToDouble() 则没有问题。虽然 single 是 32 位,double 是 64 位
  • @FurkhanShaikh 请检查更新后的答案
【解决方案2】:

还有 转换.ToSingle(): 大小 - 4 个字节 精度 -7 位

decimal.ToSingle(): 大小 - 16 字节 精度 -28-29 位小数

尽管它们可能会在显示器上给出相同的输出。 在内部它们是不一样的。

float 和 double 是 floating binary point types,其中十进制是 floating decimal point type

有趣的文章https://zetcode.com/lang/csharp/datatypes/

【讨论】:

  • 那么为什么 ToSingle() 和 ToDouble() 有效?
  • float 和 double 是 floating binary point types,其中十进制是 floating decimal point type
  • @FurkhanShaikh:将ToSingle() 结果与ToDouble() 结果进行比较的原因是,当== 的操作数混合floatdouble 时,会自动转换从floatdouble。这部分是因为转换永远不会改变值(每个float 都可以表示为double)并且很简单。 decimal 没有自动转换,因为这会引发转换可能会更改值的问题,从而导致 == 的结果错误。
  • @EricPostpischil:解释得很好,我请求您给我任何文档或网页的参考链接,以便我了解更多相关信息。
【解决方案3】:

ToSingle() 代表浮点数,ToDecimal() 代表 Double 值,这就是精度匹配的原因

【讨论】:

  • 我猜不是这样。如果您尝试 ToDouble() 和 ToSingle() 则没有问题。
猜你喜欢
  • 2010-11-06
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2023-04-08
  • 2011-07-14
  • 2018-10-05
相关资源
最近更新 更多