当输入为2.0151231E7F时,为什么不能获得20151231

mon*_*o68 1 c# floating-point

简单的问题:

Console.WriteLine("Double: " + 2.0151231E7);
Run Code Online (Sandbox Code Playgroud)

双倍:20151231

Console.WriteLine("Single: " + 2.0151231E7F);
Run Code Online (Sandbox Code Playgroud)

单身:2.015123E + 07

为什么?


背景:我正在使用soap web服务,其中声明了一个元素:

<xsd:element name="VALUE_FROM" type="xsd:float" />
Run Code Online (Sandbox Code Playgroud)

在soap响应中它看起来像这样:

<VALUE_FROM>2.0151231E7</VALUE_FROM>
Run Code Online (Sandbox Code Playgroud)

但我得到20151230而不是20151231.

har*_*old 5

20151231有25位二进制数字.A 尾数中float只有24个二进制数字.

所以最后一点必须去.

  • 在这个意义上经常使用"尾数".我不会说它错了,但它有点不幸,因为它会导致浮动间距和对数表示(在FPGA设置中越来越常用)之间的混淆.当然,在技术写作中,应该使用"有意义",因为这是技术标准的语言.在更休闲的环境中,我很难对这个问题感到兴奋. (2认同)