Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
parseFloat(java.lang.String)添加十进制数_Java_Android_Floating Point - Fatal编程技术网

parseFloat(java.lang.String)添加十进制数

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

我正在使用REST服务,得到的值类似于“0.15”。我需要将其存储为浮点变量,因此,对于转换,我使用:

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类型仍然是真实的,所以在内部我应该能够使用它执行比较和求和:)