从 String 解析浮点值时不正确,double 有效,为什么?
Float value is not correct when parsing it from a String, double works, why?
我在一个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
这里有点可疑,谁能向我解释为什么 float 值不正确?即使这样,如果我将上面的 double 值转换为 float,它也会不正确。
此外,是否可以采取任何措施将值检索为浮点数,使其与实际输入的值相等?
您了解为什么使用浮点数甚至双精度数会出现这些精度错误。如果您不太关心非常快的性能,请使用 BigDecimals 而不是浮点数或双精度数:
http://developer.android.com/intl/es/reference/java/math/BigDecimal.html
float 和 double 不允许精确存储十进制数,因为浮点数以二进制形式存储(尾数+ 指数)而不是十进制数字列表,并且两者之间没有完全匹配。你总是会失去一些精度,即使系统会尝试四舍五入显示的值来弥补这一点。
Float 的最大精度大约在 6 到 9 个十进制数字之间。
如果您想在不损失精度的情况下存储小数值,例如金额,请使用 BigDecimal
或 String
。
金额也可以存储为表示美分的整数值,但请确保使用 BigDecimal
或一些 String
操作来进行转换而不丢失精度。
也许这个对你有用!!
一位合作伙伴告诉我,java 使用 IEEE754 标准,该标准使用 32 位浮点数。
事实上,如果我们只有 32 位,第一位是符号,8 位是指数,另外 23 位是尾数。
我们从179.9中得到179个整数部分,二进制为10110011,已经填满了尾数的8位,当我们计算二进制中的0.9小数乘以2提取整数部分时,前15位为11100110011,符合浮点数(32 位)的尾数。
如果现在重新计算成十进制,2的指数正、0或负,小数部分这15位就变成了0.82958984325,远不是0.9.
来自塔拉戈纳(西班牙)的问候:-)
我在一个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
这里有点可疑,谁能向我解释为什么 float 值不正确?即使这样,如果我将上面的 double 值转换为 float,它也会不正确。
此外,是否可以采取任何措施将值检索为浮点数,使其与实际输入的值相等?
您了解为什么使用浮点数甚至双精度数会出现这些精度错误。如果您不太关心非常快的性能,请使用 BigDecimals 而不是浮点数或双精度数:
http://developer.android.com/intl/es/reference/java/math/BigDecimal.html
float 和 double 不允许精确存储十进制数,因为浮点数以二进制形式存储(尾数+ 指数)而不是十进制数字列表,并且两者之间没有完全匹配。你总是会失去一些精度,即使系统会尝试四舍五入显示的值来弥补这一点。
Float 的最大精度大约在 6 到 9 个十进制数字之间。
如果您想在不损失精度的情况下存储小数值,例如金额,请使用 BigDecimal
或 String
。
金额也可以存储为表示美分的整数值,但请确保使用 BigDecimal
或一些 String
操作来进行转换而不丢失精度。
也许这个对你有用!!
一位合作伙伴告诉我,java 使用 IEEE754 标准,该标准使用 32 位浮点数。 事实上,如果我们只有 32 位,第一位是符号,8 位是指数,另外 23 位是尾数。 我们从179.9中得到179个整数部分,二进制为10110011,已经填满了尾数的8位,当我们计算二进制中的0.9小数乘以2提取整数部分时,前15位为11100110011,符合浮点数(32 位)的尾数。 如果现在重新计算成十进制,2的指数正、0或负,小数部分这15位就变成了0.82958984325,远不是0.9.
来自塔拉戈纳(西班牙)的问候:-)