我正在使用REST服务,我得到的值类似于“0.15”。我需要存储一个浮点变量,因此,对于转换,我使用:
Float.parseFloat(value); //value = "0.15"
但是,返回的值不是严格的0.15浮点数,而是得到0.150000005960464。知道我为什么要这个吗?
如果我收到没有任何小数的值(例如10),则不会发生这种情况。
答案 0 :(得分:0)
如果你真的需要解析值" 0.15"如果确切代表实际值0.15,那么您需要使用BigDecimal
(http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html):
BigDecimal parsed = new BigDecimal(value)
你的" 10"也不完全是10,BTW。
答案 1 :(得分:0)
我不知道你是否也可以在android中做这样的事情,但我发现这个解决方案环顾四周:
NumberFormat df = DecimalFormat.getInstance();
df.setMinimumFractionDigits(2);
df.setMaximumFractionDigits(2);
float b = Float.parseFloat( df.format(a));
或许您可以尝试对数字进行舍入
float b = Math.round(a * 100)/100.0f;
答案 2 :(得分:0)
这是因为Float数字无法在系统上准确表示。
使用此格式在32位架构上表示浮点数。 http://en.wikipedia.org/wiki/Single-precision_floating-point_format
在使用此格式的64位架构上。 http://en.wikipedia.org/wiki/Double-precision_floating-point_format
上述两种格式的数字表示会导致精度损失。因此,像0.15这样的数字可以奇怪地出现为0.149999999998。
当你将0.15转换为它的二进制表示时,它会给你一个经常性的数字,即0.0010011001100 ....
然而,10有一个二进制表示,不再重复,因此可以在上述两个系统中准确表示。
然而,0.15有一些位被删除,以适应上述发生精度损失的架构。
检查有关如何将浮点数转换为二进制数的精确数学,这将更好地帮助您了解精度损失发生的位置。 http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html
答案 3 :(得分:0)
嗨,我解决了你的问题...你会用到这样你可以得到你的需要......绝对只会给出 0.15格式只使用这个...我希望你能得到你想要的答案..
String decim= "0.15456564564564";
String convert = String.format("%.2f", Double.valueOf(decim));
float v = Float.parseFloat(convert);
System.out.println(v);