类似的问题长时间处于浮动状态,为什么? https://stackoverflow.com/questions/4352213/long-in-float-why这里没有回答我正在寻找的内容。
C# 标准允许从 long 到 float 的隐式转换。
但是任何大于 2^24 的 long 当表示为浮点时必然会失去其“值”。
C# 标准明确规定,long 到 float 的转换可能会失去“精度”,但永远不会失去“幅度”。
My Questions are
- 关于整数类型,“精度”和“幅度”的含义是什么。数字 n 是否与数字 n+1 完全不同,与实数不同,其中 3.333333 和 3.333329 可能被认为足够接近以进行计算(即取决于程序员想要的精度)
- 不允许从 long 到 float 的隐式转换会引发微妙的错误,因为它可能导致 long “默默地”失去价值(作为一名 C# 程序员,我习惯于编译器在防止此类问题方面做得非常出色)
那么 C# 语言设计团队允许这种隐式转换的理由是什么?我在这里缺少什么来证明从 long 到 float 的隐式转换是合理的?
这是一个很好的问题。实际上你可以概括这个问题,因为隐式转换也存在同样的问题:
-
int
to float
-
uint
to float
-
long
to float
(你问的是)
-
ulong
to float
-
long
to double
-
ulong
to double
.
实际上,所有积分类型(乃至char
!!) 隐式转换为float
and double
;但是,只有上面列出的转换会导致精度损失。另一个值得注意的有趣的事情是,C# 语言规范在解释“为什么没有从十进制到双精度的隐式转换”时有一个自相矛盾的论点:
小数类型比浮点类型具有更高的精度,但范围更小。因此,从浮点类型到十进制的转换可能会产生溢出异常,从十进制到浮点类型的转换可能会导致精度损失。由于这些原因,浮点类型和十进制之间不存在隐式转换,并且如果没有显式转换,就不可能在同一表达式中混合浮点和十进制操作数。
我认为,“为什么做出这个决定”的问题最好由像埃里克·利珀特这样的人来回答。我最好的猜测......这是语言设计者没有任何强有力的论据支持一种或另一种方式的事情之一,所以他们选择了(他们认为的)更好的替代方案,尽管这是有争议的。在他们的辩护中,当你转换大量long
to float
,你确实失去了精度,但你仍然得到了最佳代表浮点世界中的那个数字。这与转换,比如说,int
to byte
可能存在溢出的地方(整数值可能超出了范围)byte
可以代表),你会得到一个不相关/错误的数字。但在我看来,如果没有隐式转换,这会更加一致decimal
到浮点,如果它们没有其他导致精度损失的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)