android - 从 String 解析浮点值时不正确,double 有效,为什么?

标签 android floating-point double

我在 EditText 中输入了 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

这里有些可疑,谁能向我解释为什么浮点值不正确?即使这样,如果我将上面的 double 值转换为 float,它也会不正确。

此外,是否可以采取任何措施以等同于实际输入值的方式将值检索为 float ?

最佳答案

floatdouble 不允许精确存储十进制数,因为 float 以二进制形式(尾数 + 指数)存储,而不是列表十进制数字,两者之间没有完全匹配。您总会失去一些精度,即使系统会尝试四舍五入显示的值来弥补这一点。

Float 的最大精度大约在 6 到 9 位小数之间。

如果您想在不损失精度的情况下存储小数值,例如金额,请使用 BigDecimalString

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

关于android - 从 String 解析浮点值时不正确,double 有效,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673034/

相关文章:

python - int() 和 float() 的行为不一致

python - 不能将序列乘以 'float' 类型的非整数

iOS 将 Double 值四舍五入到小数点后 2 位,并将小数点后第三位向上舍入

java - Android蓝牙远程控制项目指导

java - Spring - 更改内容类型 HTTP header

floating-point - Fortran 实数表达式中的后缀 'd+0'

java - Java中的双十进制格式

java - 如何反转枚举?

javascript - 平台无关的 JS->Native Bridge?

java - 如何在 Java 中用减法保持十进制值