我正在学习学习C#。我完全不知道为什么以及这里的正确答案是什么。我搜索得很多,一无所获。人们解释说,但没有找到解释。什么是正确的答案以及为什么?
以下哪项转换可能会导致精度下降?
为什么浮动到十进制和十进制都浮动可能会失去精度转换..?
答案 0 :(得分:3)
以下哪项转换可能会导致精度下降?
一个。将int转换为float
int
具有32位精度,完全用于数字的非小数部分。 float
具有32位精度,但这些位中的一些用于指数,留下少于32位来表示尾数。因此,有些数字可以表示为int
,但不能表示为float
。
例如:
int i = int.MaxValue; // = 2147483647
float f = (float)i; // = 2147484000 --> lost last three digits!
湾将浮点数转换为长
我希望你很容易看到从浮点到整数类型的转换如何失去精确度。
℃。将long转换为int
你的书没有提到这是一个问题,这表明它的精确度损失与精确度的损失(仅供参考)。
在C#中,long
是64位,而int
只是32位。任何大于int.MaxValue
的数字(即2147483647
)都不能由int
表示,但许多此类数字可由long
表示。将任何此类号码从long
转换为int
将导致准确性下降,即结果数字甚至不接近正确的数字。
可以说它也失去了精确度,但我想你的书专注于仅精度丢失的情况?
d。将int转换为long
我假设您理解为什么这不会失去精确度(或准确性)。
即将浮点数转换为小数
F。将小数转换为浮点数
为什么浮动到十进制和十进制以浮动可能的精度转换损失..?
decimal
到float
稍微容易解释一下:我们首先使用decimal
的原因是因为普通float
数字类型根本无法解决表示decimal
可以存在的某些值以及哪些值对于常见的计算类型(例如货币计算)很重要,而对于其他值decimal
也不能表示它至少可以更接近地代表它们。
例如:
float f = 1f / 3;
decimal d = 1M / 3;
float f2 = (float)d;
在上文中,变量f
的值为0.333333343
,而变量d
的值为0.3333333333333333333333333333
。两者都不准确(因为1/3是重复的小数,它不能由有限的计算机表示),但decimal
版本更接近正确的答案。
同样,从decimal
转换回float
会导致精度下降,因为变量f2
最终会与f
的值相同:{{ 1}}。
但是从0.333333343
到float
的转换呢?
嗯,虽然decimal
的精确位数比decimal
更高(约28比7),但float
类型支持的数字幅度小到float
(即1.401298E-45
)。但是float.Epsilon
不能代表具有如此小幅度的数字(它只能表示小到大约decimal
的幅度)。将1E-28
数字转换为小于float
可以表示的数字将导致值decimal
,从而丢失那些有效的十进制数字。
换句话说:虽然0
只有7位精度而float
有28位,decimal
可以将这些数字移动到小数点右边比{{1}更远的位置允许float
中比decimal
更小的数字可以表示。
因此,可能会失去任何一种方式的精度(这就是为什么在这些类型之间没有C#中的隐式转换......只有在没有信息丢失的情况下才提供隐式转换。)
另见:
Explicit Numeric Conversions Table (C# Reference)
Single Structure
Decimal Structure
Difference between Decimal, Float and Double in .NET?