我正在学习学习C#。我完全丧失了为什么以及这里的正确答案。我搜查了很多,什么都没找到。人们解释,但没有解释被发现。什么是正确的答案,为什么?浮点到十进制和十进制浮点。所有转换一般
在以下哪些转换过程中可能会损失精度?
- a。将int转换为浮点数
- b。将浮点数转换为长整数
- c。将长整型转换为整型
- d。将一个int转换为长整数
- e。将浮点数转换为小数点
- f。将小数转换为浮点数
为什么浮动到十进制和十进制浮点可能会导致精度转换的损失..?
我正在学习学习C#。我完全丧失了为什么以及这里的正确答案。我搜查了很多,什么都没找到。人们解释,但没有解释被发现。什么是正确的答案,为什么?浮点到十进制和十进制浮点。所有转换一般
在以下哪些转换过程中可能会损失精度?
为什么浮动到十进制和十进制浮点可能会导致精度转换的损失..?
在以下哪些转换过程中可能会损失精度?
a。将int转换为浮点数
int
具有32位精度,完全用于数字的非小数部分。 float
具有32位的精度,但其中一些位用于指数,而少于32位表示尾数。因此,有数字可以表示为int
但不能如float
。
例如:
int i = int.MaxValue; // = 2147483647
float f = (float)i; // = 2147484000 --> lost last three digits!
湾将浮点数转换成长整数
我希望您能够轻松看到浮点到整数类型的转换如何失去精度。
c。转换一个长为int
这是一个问题,表明它是区分精度(仅供参考)损失的精度损失你的书并没有提到这一点。
在C#中,long
是64位,而int
只有32位。大于int.MaxValue
(即2147483647
)的任何数字不能用int
表示,但许多这样的数字可以用long
表示。将任何这样的号码从long
转换为int
将导致准确性的损失,即所得到的号码甚至不接近正确的号码。
可以说,它有也失去精度,但我猜你的书的重点是哪里仅精度丢失的情况?
d。将一个整数转换成长整数
我假设你理解为什么这不会失去精度(或精度)。
e。将浮点数转换为小数点
f。将小数转换为浮点数
为什么浮动到十进制和十进制浮点可能会导致精度转换的损失..?
decimal
到float
有点容易解释:我们甚至在第一时间使用decimal
的原因是因为正常的float
数字类型根本无法代表decimal
可以的,哪些是重要的,常见的某些价值观的计算(例如货币计算),而其他值也不能代表它至少能代表它们更接近。
例如:
float f = 1f/3;
decimal d = 1M/3;
float f2 = (float)d;
在上文中,可变f
将具有值0.333333343
,而可变d
将具有值0.3333333333333333333333333333
。两者都不准确(因为1/3是重复小数,它不能用有限的计算机表示),但版本更接近正确的答案。
类似地,从decimal
回float
结果转换中精度的损失,作为可变f2
卷取用相同的值,该值的确f
:0.333333343
。
但是从float
转换为decimal
怎么样?
好,而decimal
具有精度比float
确实(约28 VS 7)中,float
类型支持数字与幅度小1.401298E-45
(即float.Epsilon
)更显著数字。但decimal
不能代表具有如此小幅度的数字(它只能表示与约1E-28
一样小的数值)。转换float
数字的幅度小于decimal
可以表示的数字将导致值为0
,丢失那些重要的十进制数字。
换句话说:当float
只具有精度7位和decimal
有28个,float
可以更远移动这些数字的小数点右边比decimal
可以,允许使用更小幅度的号码float
比decimal
能代表。因此,无论哪种方式都有可能导致精度下降(这就是为什么在这些类型之间C#中没有隐式转换,只有在没有信息丢失时才提供隐式转换)。
参见:
Explicit Numeric Conversions Table (C# Reference)
Single Structure
Decimal Structure
Difference between Decimal, Float and Double in .NET?
感谢您的回答,我会立即阅读。 – MakerOfTheUnicake
写得很漂亮。我祝你最好,我非常感谢你的解释。我一定会查看这些链接。 – MakerOfTheUnicake
但是以什么方式做了长时间的精度为int原因引起?它没有。 – MakerOfTheUnicake
每当你提到“精确度损失”时,你实际上是指潜在的损失 – cleftheris
是的,这就是对的。 – MakerOfTheUnicake