我存储了一个来自后端系统的长值,我不得不将其转换为浮点数,因为其中一个第三方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
答案 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通过很长时间到第三方库。如果长值稀疏,则有可能在您使用的有效长值中,您可以经常从浮点映射回而不会产生歧义。
但这是一个讨厌的问题。如果出现歧义,请准备好应对歧义。