C#打印浮点值-0.0错误

时间:2019-04-03 00:51:30

标签: c# printing floating-point format

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?

2 个答案:

答案 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();
}