Console.WriteLine(" 0.0 float: 0x00000000, {0}", (float)0x00000000);
Console.WriteLine("-0.0 float: 0x80000000, {0}", (float)0x80000000);
C#会为第一个打印0.0,而不是-0.0会打印2.147484E + 09,这不是我期望的。 根据此在线IEEE-754浮点格式转换器0x80000000应该为-0.0,因为浮点格式使用支持-0.0的符号幅度格式。
https://www.h-schmidt.net/FloatConverter/IEEE754.html
如何让C#为0x80000000的UInt32位模式打印-0.0?
答案 0 :(得分:3)
当您执行(float)0x80000000
时,您要获取一个整数值(0x80000000 = 2.147484E + 09)并将其强制转换为浮点数(值相同,但现在是浮点数)。您想要的是获取字节数组并将其解释为float:
uint l = (uint)0x80000000;
float f = BitConverter.ToSingle(BitConverter.GetBytes(l), 0);
Console.WriteLine("-0.0 float: 0x80000000, {0}", f);
输出:
-0.0 float: 0x80000000, 0
答案 1 :(得分:1)
我要执行的操作是将0x80000000的UInt32模式转换为-0.0f的正确值,并将该值打印为-0.0 – DragonSpit
我有一个坏消息,显然无法获得想要的东西:
通过PETER SESTOFT: 关于负零的一些混淆可能源于 C#的当前实现在其中打印出正零和负零的事实 与0.0相同,格式参数的组合似乎也不会影响 该显示。尽管这可能是出于最好的意图,但这是不幸的。要揭示一个负零,您必须诉诸于看起来很奇怪的代码,其中 之所以有效是因为1 /(-0.0)= -Infinity <0:
public static string DoubleToString(double d) {
if (d == 0.0 && 1/d < 0)
return "-0.0";
else
return d.ToString();
}