【问题标题】:Is Range of value depends upon Size of datatype?值的范围是否取决于数据类型的大小?
【发布时间】:2023-04-01 21:51:02
【问题描述】:

float 大小为 4 个字节,long 大小为 8 个字节。
所以,float 的大小小于 long 的大小。但是,浮动范围大于长。

十进制和双精度的大小写相同。

数据类型

  +----------+------------+----------------------+
  | Data Type|   Size     |        Range         |
  +----------+------------+----------------------+
  |  long    | 8 bytes    |-9.22e18 .. 9.22e18   |
  |  float   | 4 bytes    |-3.40e38 .. 3.40e38   |
  |  decimal | 16 bytes   |-7.92e28 .. 7.92e28   |
  |  double  | 8 bytes    |-1.80e308 .. 1.80e308 |
  +----------+------------+----------------------+

示例:

        decimal f = 10000000000000000000.0m;            //takes 16 bytes
        double d = 10000000000000000000000000000.0d;   //takes 8 bytes

所以,double 可以保持更大的值,并且比 decimal 占用更少的大小。为什么?

【问题讨论】:

标签: c# types


【解决方案1】:

因为 double 用于指数的位比十进制的多。

【讨论】:

    【解决方案2】:

    因为对于较大的值,使用 double 和 float 会降低一些准确性。查看IEEE Standard for Floating-Point Arithmetic 了解确切的方程式。

    简单地说,就是这样想的。如果我给你 2 个个位数的数字来表示一个值,你可以通过几种方式来表示该数字......

    如果您只是遵循书写数字的常规约定,您的范围将是 00 -> 99。但是,您可以选择以科学计数法对两个数字进行编码,那么您的范围将是 0 x 10^0 -> 9 x 10^9。

    最后两种编码表示相同数量的可能值,但后面编码的范围要大得多。

    【讨论】:

    • 我不确定我理解你最后一句话的意思。如果它们都代表相同数量的可能值,怎么能有更大的范围?
    • 因为在后一种编码中存在“间隙”,但每个值可以精确编码 100 个值:(0 -> 99) 在第一个和第二个中,您可以将 0 -> 9 编码为 n x 10^0 然后 10, 20, 30, 40... 作为 n x 10^1 但您不能在此编码中表示 11 -> 19。这仍然有点神秘,但我希望它更清楚一些。
    【解决方案3】:

    在内部,浮点数是近似值。它们不是整数的精确值。所以你在双打范围内获得的收益,你付出的准确性。你对双精度数进行的操作越多(加法、减法……),它们就越失去准确性。对于大多数计算,双精度数是完美的,但对于货币计算,您肯定需要使用小数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多