我有一个来自csv文件中其中一个记录的10位数字符串,我需要将其转换为float并使用预准备语句上传到oracle表:
String s = '2788539392';
Float f = Float.parseFloat(s);
sql_statement.setFloat(1, f));
为什么它会改变以下值:
csv : 2788539392
java: 2.78853939E9 (float)
oracle: 2788539390
任何人都知道如何使用float保存确切的值?
答案 0 :(得分:2)
Float是精度类型有限的,会有舍入错误,数字这么大。这是由于数字在浮点数中的表示方式(详见@LưuVĩnhPhúc的答案)。如果您需要保留确切的值,请使用BigDecimal
等类型。
答案 1 :(得分:1)
问题是这个数字太大而不适合浮动。如果您使用BigDecimal
,则会保留正确的值。
String s = "2788539392";
BigDecimal d = new BigDecimal(s);
System.out.println(d);
我希望这有帮助。祝你好运!
答案 2 :(得分:0)
float
是IEEE-754单精度,其具有24位尾数,因此任何宽于24位的整数将其精度限制为24位或大约7.2位十进制数。 double
有53位尾数,因此它可以存储任何大小为2 53 -1的整数。
如果只需要使用整数,请使用64位类型的long
。如果您需要精确存储十进制小数值,则必须使用BigDecimal
。否则double
可能符合您的要求。