0

我想将我从数据库中获得的经度和纬度转换为字符串。该字符串是正确的,当我尝试将其转换为双精度时,它也是正确的。但是,当我将双精度值或字符串值(我都尝试过)转换为浮点值时,最后一个小数会四舍五入。

string 或 double 的值为 59.858139 转换为 float 为 59.85814

我已经尝试了一切,这是一个绝望的例子:)

private float ConvertToFloat(double d)
{
    float f = 00.000000f;
    f = (float) d;
    return f;
}
4

3 回答 3

7

您知道双精度数比浮点数具有更高的精度,并且浮点数会四舍五入,对吗?这是预期的行为。在这种情况下,将 double 类型转换为 float 是没有意义的。

这里有一些东西可以让你朝着正确的方向思考......

    Double.doubleToRawLongBits(long value);
    Float.intBitsToFloat(int bits);

双打不适合 int,它们必须适合 long。它的大小确实是原来的两倍,即使用字符串调解位在这里也没有任何好处。

于 2012-08-09T10:24:18.867 回答
3

1. float精度只有24位,不足以容纳你的经纬度位数。

2.四舍五入是由于数字的大小。因此double,如果您需要浮点,请使用,或者使用BigDecimal

于 2012-08-09T10:30:53.930 回答
1

我们从你的十进制数开始59.858139

将该数字转换为二进制:111011.11011011101011101111111101011100011011000001000110100001000100...

即数字是二进制的无限小数。无法准确表示。(就像不可能用十进制数字精确表示 1/3 一样)

将数字重写为某种形式的二进制科学记数法:

10 ^ 101 * 1.1101111011011101011101111111101011100011011000001000110100001000100...

请记住,这仍然是二进制,因此10 ^ 101对应2 ^ 5于十进制。

现在...浮点值可以在尾数中存储 23 位。如果我们使用“四舍五入”舍入模式将其四舍五入,我们得到:

10 ^ 101 * 1.11011110110111010111100

这等于:

111011.110110111010111100

这就是适合浮点数据类型的所有精度。现在将其转换回十进制:

59.8581390380859375

实际上似乎非常接近 59.858139……但这只是运气。如果我们将第二个最接近的浮点值转换为二进制会发生什么?

111011.110110111010111011 = 59.858135223388671875

所以基本上分辨率大约是0.000004.

所以我们可以从浮点值中真正知道的是这个数字是这样的:59.858139±0.000002

它也可以是59.858137or 59.858141

由于最后一位数字相当不确定,我猜测打印代码足够聪明,可以理解最后一位数字超出浮点值的精度,因此,该值被舍入为59.85814.


顺便说一句,如果你(像我一样)懒得手动在二进制和十进制之间转换,你可以使用这个转换器。如果您想了解更多关于浮点系统的详细信息,浮点表示的维基百科页面是一个很好的资源。

于 2012-08-09T12:07:14.960 回答