隐式转换和数量级

时间:2015-11-25 16:39:43

标签: c#

在C#标准中说:

  

从int,uint,long或ulong到float和from long或者的转换   ulong to double可能会导致精度损失,但永远不会导致   损失

任何人都可以解释一下这意味着什么幅度?给定 一个数字我怎么能计算它的大小? (即 int )。

2 个答案:

答案 0 :(得分:2)

例如:

var a = Int64.MaxValue; // a = 9223372036854775807L

var b = (float)a; // b = 9.223372037e+18

a和b具有相同的数量级,它们彼此非常接近,但它们不相等......

基本上长(Int64)可以将整数表示为特定范围内的精确精度。浮点类型会牺牲精度,因此它们可以表示更大范围的数字,也可以表示分数。所以.net中的所有积分类型都适合范围意义上的浮点数,但是你可能会放松精度(某个小数位后的数字可能不正确。但是" scale"(数量级) )数字和一些更有效的数字将被保留...

https://en.wikipedia.org/wiki/Order_of_magnitude

答案 1 :(得分:-1)

似乎不清楚the spec you quoted所指的是什么“幅度”,它实际上应该是“数量级”。

Dictionary.com defines "magnitude"`as:

  

数量的数字特征并形成基础   比较相似的数量,如长度。

Wikipedia defines it说:

  

任何数字的大小通常称为“绝对值”或   “模数”,用| x |表示。

你可以得出结论,规范是说它是由变量代表的数量或实际值。但是,正如其他人在此处正式指出的那样,情况并非如此

通过运行一个简单的测试(就像其他人已经完成的那样),这个事实就变得很明显了:

long x = 8223372036854775807; // arbitrary long number
double y = x; // implicit conversion to double
long z = Convert.ToInt64(y); // convert back to int64 (a.k.a. long)
System.Diagnostics.Debug.Print(x.ToString());
System.Diagnostics.Debug.Print(z.ToString());

这会产生输出:

  

8223372036854775807

     

8223372036854775808

因此,从中可以看出,规范虽然模糊且不精确,意味着字典或维基百科定义的“幅度”的定义,但更接近于定义"order of magnitude"。具体做法是:

  

数量级以10的幂表示。

  

数量级用于进行近似比较。

  

两个相同数量级的数字具有大致相同的比例。

与所讨论的C#规范以及我们从测试中看到的结果相符。