parseFloat(java.lang.String)添加十进制数
我正在使用REST服务,得到的值类似于“0.15”。我需要将其存储为浮点变量,因此,对于转换,我使用:parseFloat(java.lang.String)添加十进制数,java,android,floating-point,Java,Android,Floating Point,我正在使用REST服务,得到的值类似于“0.15”。我需要将其存储为浮点变量,因此,对于转换,我使用: Float.parseFloat(value); //value = "0.15" 但是,返回的值不是严格的0.15浮点值,而是0.15000005960464。知道我为什么会得到这个吗 如果我接收到的值没有任何小数(例如10),则不会发生这种情况。如果确实需要将值“0.15”解析为精确表示实际值0.15的值,则需要使用BigDecimal(): BigDecimal parsed=新的Bi
Float.parseFloat(value); //value = "0.15"
但是,返回的值不是严格的0.15浮点值,而是0.15000005960464。知道我为什么会得到这个吗
如果我接收到的值没有任何小数(例如10),则不会发生这种情况。如果确实需要将值“0.15”解析为精确表示实际值0.15的值,则需要使用
BigDecimal
():
BigDecimal parsed=新的BigDecimal(值)
顺便说一句,你的“10”也不完全是10。我不知道你是否也可以在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;
这是因为浮点数无法在系统上精确表示 浮点数在32位体系结构上使用此格式表示。 而在使用此格式的64位体系结构上。 以上述两种格式表示数字会导致精度损失。因此,像0.15这样的数字可能会奇怪地变成0.1499999998 当您将0.15转换为二进制表示时,它会给您一个循环数,即0.0010011001100 但是,10有一个二进制表示,它不是重复出现的,因此可以在上述两个系统上精确表示 但是,0.15删除了一些it位,以适应发生精度损失的上述体系结构 检查如何将浮点数转换为二进制的精确数学,这将更好地帮助您了解精度损失发生的位置。
您好,我解决了您的问题…您将像这样使用您可以得到您的需要…它肯定只会给出0.15格式仅使用此…我希望您能得到您想要的答案
String decim= "0.15456564564564";
String convert = String.format("%.2f", Double.valueOf(decim));
float v = Float.parseFloat(convert);
System.out.println(v);
这是因为浮点没有必要的精度来精确存储0.15。如果可以,使用
double
代替,尽管double
也会阻塞某些值…呸。。。跳过float
和double
并使用BigDecimal
是否有任何文档说明了发生这种情况的原因?读取的可能重复。正如您所知,您看到的并不是Java特有的。你可以在每种语言中找到它。当我使用浮点而不是BigDecimal时,我自己也遇到了Ruby的问题。这仍然会导致一个问题。。。以他所说的同样不精确的方式传递浮点或双次传递。@buzzsawddog-如果值是字符串,则不是这样。BigDecimal
是不可变的:-)会在中咬人,但不时…OP值中必须是字符串,因为它是作为将其存储在BigDecimal中可以解决我的Java代码中的问题。问题是该值的最终目标是SQLite数据库。我想我必须将其作为字符串传递-我想这并没有问题,DB类型仍然是真实的,所以在内部我应该能够使用它执行比较和求和:)