Android 当从字符串解析浮点值时,它是不正确的,double可以工作,为什么?

Android 当从字符串解析浮点值时,它是不正确的,double可以工作,为什么?,android,floating-point,double,Android,Floating Point,Double,我在编辑文本中输入179.9。当我检索它时,如果它存储为float,则值是不同的 final EditText valueInput = mEntryDialogView.getValueInput(); final CharSequence input = valueInput.getText(); final String inputAsString = input.toString().trim(); final float asFloat = Float.valueOf(inputAsS

我在编辑文本中输入179.9。当我检索它时,如果它存储为
float
,则值是不同的

final EditText valueInput = mEntryDialogView.getValueInput();
final CharSequence input = valueInput.getText();
final String inputAsString = input.toString().trim();
final float asFloat = Float.valueOf(inputAsString); //179.899994
final double asDouble = Double.valueOf(inputAsString); //179.9
这里有点可疑,有人能给我解释一下浮动值不正确的原因吗?即使如此,如果我将上面的双精度值转换为浮点值,它也是不正确的


此外,是否可以采取任何措施以浮点数的形式检索值,使其与实际输入值相等?

您了解为什么使用浮点数甚至双精度时会出现这些精度错误。如果您不太关心非常快的性能,请使用大小数而不是浮点或双精度:


浮点数和双精度
不允许精确存储十进制数,因为浮点数是以二进制形式(尾数+指数)存储的,而不是十进制数字列表,并且两者之间没有精确匹配。即使系统试图对显示的值进行四舍五入以补偿精度,也会始终丢失一些精度

浮点的最大精度约为6到9位小数

如果要在不损失精度的情况下存储十进制值(例如,金额),请使用
BigDecimal
String


金额也可以存储为表示美分的整数值,但请确保使用
BigDecimal
或一些
String
操作来进行转换,而不会丢失精度。

也许这对您很有用

正如一位合作伙伴告诉我的,java使用IEEE754标准,该标准使用32位浮点。 事实上,如果我们只有32位,第一位是符号,8代表指数,另外23代表尾数。 我们有179个整数部分,179.9是10110011,二进制,它已经填充了尾数的8位,当我们计算二进制的0.9小数乘以2并提取整数部分时,前15位是11100110011,这是适合浮点尾数的那些(32位)。 如果现在重新计算为十进制,则2的指数为正、0或负,小数部分的这15位变为0.82958984325,远远超过0.9


来自塔拉戈纳(西班牙)的问候:-)

事件的可能重复,虽然它大约是两倍,但同样的浮点值更高。它确实部分地回答了这个问题,但我仍然想知道一个在Android上工作的解决方案。这种行为在Android或其他平台之间不会改变。只是浮点数没有你需要的精确精度。如果你说你正试图用这个值做什么,为什么它必须是你想要的,那么人们可以建议不涉及浮动的替代方案。在制作一个字符串之前,你是否尝试过将其转换为双/浮动?我认为转换为字符串并返回(double->string->double或float->string->float)应该是可行的。这应该可以解决对话问题。基本上,这些四舍五入的“问题”是正常的,正如已经发布的链接所解释的。我的理解是,这样精度的浮点(6-9位小数)足以存储一个数字(例如,在本例中为179.9位),而不需要进行任何更改,但我想我在这一点上是错的-因此感谢您的澄清,你的回答帮助我解决了我这边的问题。这不是十进制精度,而是二进制精度。179.9不能很好地使用二进制表示法,双精度表示法也不能很好地使用,但在格式化输出时,双精度表示法足够接近179.9。p、 对不起,我刚刚意识到我基本上重复了答案