11

起初,对不起我的英语不好。我有代码片段:

long x = 9223372036854775807L;
double f = x;
Console.WriteLine(x);           
Console.WriteLine(f);

输出是:

9223372036854775807
9,22337203685478E+18

在编译和执行此代码时,我没有收到任何错误。在将 Long 转换为 Double 时,我们会损失精度。为什么 C# 在这种情况下不需要显式转换?

谢谢大家。

4

2 回答 2

13

该语言内置了一些隐式转换。

下表来自文档,这就是为什么您可以在没有显式强制转换或转换的情况下分配值的原因:

From        To
===============================================================================
sbyte       short , int, long, float, double, or decimal
byte        short , ushort, int, uint, long, ulong, float, double, or decimal
short       int , long, float, double, or decimal
ushort      int , uint, long, ulong, float, double, or decimal
int         long , float, double, or decimal
uint        long , ulong, float, double, or decimal
long        float , double, or decimal
char        ushort , int, uint, long, ulong, float, double, or decimal
float       double
ulong       float , double, or decimal

在文档中它指出(强调我的):

从 int、uint、long 或 ulong 到 float 以及从 long 或 ulong 到 double的转换可能会丢失精度,但不会丢失量级。

于 2013-02-13T18:34:18.310 回答
0

尝试这个

long x = 9223372036854775807L;
decimal f = x;
Console.WriteLine(x);
Console.WriteLine(f);
于 2019-10-09T13:51:33.770 回答