将UInt32转换为float而不进行舍入?

时间:2014-11-10 15:09:54

标签: c#-4.0 floating-point rounding floating-point-precision

我需要将UInt32类型转换为float而不进行舍入。说我做

float num = 4278190335;
uint num1 = num;

该值立即变为4278190336.有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:8)

  

我需要将UInt32类型转换为浮点数而不进行舍入。

无法完成。

有2个 32 可能的uint值。有少于2个 32 float值(有2个 32 位模式,但包括各种NaN值)。除此之外,显然有很多float值无法表示为uint(例如0.5),很明显,您无法代表每一个uint {1}}正好在float中。但是,每个uint(以及每个int可以完全表示为double,因此这可能是您问题的解决方案。

您在原始源代码中看到的问题是4278190335并不能完全代表float;最近的float值为4278190336.从floatuint的转换不存在问题 - 从您确切的值转换出来的问题是&#39 ;在源代码中指定为float; floatuint转换单独发生(并且很容易丢失信息)。

答案 1 :(得分:2)

float只有23位尾数。除了隐含的1位,它只能代表所有适合24位的数字。对于大于该数字的数字,它只能存储最接近的值。

double可以精确地表示[-2 ^ 53,2 ^ 53]范围内的所有数字,因此它可以存储任何适合32位int的值。但是,双倍不能将所有数字存储在long的范围内,尽管它们具有相同的大小(64位)

答案 2 :(得分:1)

除了你的问题是措辞落后;我想你在说什么。

您需要获取浮点值的整数部分,例如它的整数值不是十进制值。在这种情况下,您可以简单地将浮点数转换为int,转换不会舍入。 e.g。

float myFloat = 1.5;
uint myInt = (uint)myFloat; //myInt == 1

请记住,虽然读取代码的其他人并不总是清楚这一点。为了帮助Math.Floor和Math.Ceiling ... Floor返回当前值以下的整数,ceiling返回它上面的整数 e.g

float myFloat = 1.5;
uint myFloorInt = (uint)Math.Floor(myFloat); //myFloorInt == 1
uint myCeilingInt = (uint)Math.Ceiling(myFloat); //myCeilingInt == 2

您需要根据需要将值从float转换为uint,int等。大多数人都不喜欢投射,因为结果值并不总是让人清楚......转换有多种方法可以帮助你以一种清晰易懂的方式将一个值转换为另一个值。