【问题标题】:Is conversion from Decimal type to Single type a narrowing conversion or a widening conversion?从 Decimal 类型到 Single 类型的转换是缩小转换还是扩大转换?
【发布时间】:2019-08-20 20:05:17
【问题描述】:

在 Ms Docs 的 Single struct 和 Decimal struct 文档中,关于从 Decimal 到 Single 的类型转换,前者说它正在扩大转换,而后者说它正在缩小转换。哪一个是对的? 而且我不明白在转换为 Single 类型时如何保留 Decimal 类型的大小。请解释一下。

【问题讨论】:

  • 请添加指向您正在讨论的文档的链接。
  • 幅度将被保留,但精度不会
  • 对不起,这里是分别讨论 Single 和 Decimal 类型的链接。单:link 十进制:link

标签: c# .net


【解决方案1】:

严格来说,从 Decimal 到 Single 的转换既不是缩小也不是扩大。 Decimal 的范围比 Single 的范围更窄,但它的精度更宽

从 Decimal 到 Single 的转换永远不会抛出 OverflowException,但它会导致信息丢失。这就是为什么在任一方向都没有隐式转换。

Single 的范围为 ±1.5 x 10−45 到 ±3.4 x 1038,而 Decimal 的范围为 ±1.0 x 10 −28 至 ±7.9228 x 1028。因此,尽可能小的 Decimal 和尽可能大的 Decimal 都可以放入 Single 而不会溢出。小数的大小将保持不变。

但是,Single 的精度仅为 6-9 位(以 10 为基数),而 Decimal 的精度为 28-29 位。因此,如果将 Decimal 转换为 Single,则第 6-9 位之后的任何数字都将丢失。可能会丢失信息,但不会丢失数量的大小。

More Information

您问存储在 12 个字节中的 Decimal 的大小怎么可能适合只有 4 个字节的 Single。原因是十进制/浮点数不存储为直接转换为二进制 - 存储的一部分用于幅度(如科学格式中的“10 次方”),一部分用于二进制相当于数字本身。

【讨论】:

  • 据我了解,Decimal 类型的存储空间比 Single 类型大得多,所以起初我认为将 Decimal 类型的值强制转换和分配给 Single 类型变量也会影响它的大小。但是就像您说的那样,如果您尝试将隐​​藏的其余数据打印出来,因为使用更大的数据类型(如 Double)的 Single 数据类型的精度有限,它似乎保留了幅度。所以这让我很困惑。
  • 通过将 Decimal 值分配给较小的 Single 类型变量,我认为在该过程中原始大小的部分应该被截断或以某种方式受到影响,但是尽管 Single 类型的大小较小,但仍保留了大小,这怎么可能?
  • 我将在我的回答中添加更多细节以提供帮助。
  • 非常感谢您的详细解答,帮助很大。
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多