浮动到长转换增加值

时间:2017-08-11 06:07:32

标签: java floating-point

我存储了一个来自后端系统的长值,我不得不将其转换为浮点数,因为其中一个第三方api只能理解浮点数。 现在,当我回读浮动并尝试转换回长时间时,我得到的数字更大(有时候我看到的更小),而不是我的数字。

我的问题是如何才能长时间取回原始号码。如果需要,我很乐意添加任何舍入逻辑

public class Main {

    public static void main(String[] args) {


        long item = 1502028000;

        System.out.println(String.format("item -> %d",item));

        float floatItem = item;

        System.out.println(String.format("floatItem ->  %f",floatItem));

        long resultItem = (long)floatItem;

        System.out.println(String.format("resultItem ->  %d",resultItem));

    }
}

以下是输出。在这种情况下,我需要原始号码1502028000。

item -> 1502028000
floatItem ->  1502028032.000000
resultItem ->  1502028032

2 个答案:

答案 0 :(得分:0)

浮动似乎没有足够的尺寸来转换长期"价值因而在转换时,它会失去它的精确度。

要解决此问题,您可以使用double而不是float。在您进行双重转换后,这将保留您的价值。

long item = 1502028000;
double floatItem = (double)item;
long resultItem = (long)floatItem;
System.out.println(String.format("resultItem ->  %d",resultItem));

打印:

resultItem ->  1502028000

答案 1 :(得分:0)

浮点值只有~24个有效位,long有64位。因此,必须发生一些/许多不同的长值给出相同的浮点值。那无法恢复。

你说你的长期总是1000的倍数。所以对应于你给定的浮点数的许多长数,只有那些除以1000的除数对你有效。这就是您的舍入建议Math.round(value/1000)*1000将使用的内容。但这只有在超过1000个长度映射到一个浮点数时才有效,这种情况发生在100亿左右。你的例子只比这个数字低10倍,因此如果数字可以增长,那么它将无法可靠地帮助。

如果你真的必须将float值映射回原来的long(问问自己:为什么有必要 - 我可以用另一种方式完成我的工作吗?),无论你在哪里,你都可以保持一个从Float值到原始Long值的Map通过很长时间到第三方库。如果长值稀疏,则有可能在您使用的有效长值中,您可以经常从浮点映射回而不会产生歧义。

但这是一个讨厌的问题。如果出现歧义,请准备好应对歧义。