简单问题:
Console.WriteLine("Double: " + 2.0151231E7);
双倍:20151231
Console.WriteLine("Single: " + 2.0151231E7F);
单身:2.015123E + 07
为什么吗
背景:我正在使用一个肥皂网服务,其中声明了一个元素:
<xsd:element name="VALUE_FROM" type="xsd:float" />
在肥皂反应中它看起来像这样:
<VALUE_FROM>2.0151231E7</VALUE_FROM>
但是我的20151230而不是20151231。
答案 0 :(得分:5)
20151231有25位二进制数字。 float
只有24 binary digits in the mantissa。
所以最后一点不得不去。
答案 1 :(得分:3)
它与Float(IEEE 754)与Double数据类型的精度有关 - 后者具有更高的精度,因此数字可以完全表示。
定义单个精度浮点数如何在计算机中表示的IEEE 754标准仅指定有效数(分数)的24位精度(信息)和指数的8位信息。
答案 2 :(得分:1)
这只是因为浮动(用System.Single表示的.Net)根本不够精确。
通过使用double而不是float,可以获得更好的精度,但是仍然会有一些(但更少)近似值。
如果要在不损失精度的情况下操作整数,请使用整数类型(int,uint,long,ulong等...)
来自文档:
浮点值和精度损失
请记住,浮点数只能近似小数 number,并确定浮点数的精度 这个数字接近十进制数的准确程度如何。默认情况下, 单个值仅包含7个十进制数字的精度,尽管a 内部最多保留9位数字。一个人的精确度 浮点数有几个结果:
两个浮点数对于特定的看似相等 精度可能无法比较,因为它们最不重要 数字是不同的。
使用浮点数学或比较操作 如果使用十进制数,则数字可能不会产生相同的结果 因为浮点数可能不完全接近 十进制数。
如果涉及浮点数,则值可能不会进行往返。一个 如果操作转换原始值,则称该值为往返 浮点数到另一种形式,逆运算转换 转换后的表格返回浮点数,最后一个 浮点数等于原始浮点数。 往返可能会因一个或多个最低有效数字而失败 在转换中丢失或更改。