Android(Java)开发计算器应用可存小数的最长数据类型及限制
Java存储高精度小数的类型选型说明
针对计算器开发的数值存储场景,结论非常明确:
- 如果你找的是基本数据类型,精度最高、能存储最多有效小数位的是
double,但它存在天然的精度缺陷,不适合计算器场景。 - 如果要实现无精度丢失的小数存储、支持最多小数位,必须用对象类型
java.math.BigDecimal,这也是Java生态里金融、计算类场景的标准选型。
各小数存储类型的具体取值限制
1. 基本浮点类型double(不推荐计算器使用)
- 存储规格:64位双精度浮点数,遵循IEEE 754标准
- 有效精度:仅能保证15~17位十进制有效数字,超出长度的小数会自动截断、出现精度偏差,连续运算时误差会累积,比如
0.1 + 0.2得到的不是0.3,而是0.30000000000000004 - 取值范围:绝对值范围约为
4.9e-324 ~ 1.8e+308
2. 基本浮点类型float(完全不适合计算器场景)
- 存储规格:32位单精度浮点数,遵循IEEE 754标准
- 有效精度:仅能保证6~7位十进制有效数字,精度丢失问题比
double更严重 - 取值范围:绝对值范围约为
1.4e-45 ~ 3.4e+38
3. 高精度类型BigDecimal(计算器场景首选)
- 存储逻辑:底层由任意长度的不可变整数非标度值 + 32位整数标度组成,没有固定的小数位上限,只要运行内存足够,理论上可以存储任意长度的小数,不会出现浮点数的精度丢失问题
- 取值范围:可表示的数值区间为
(-2^2147483647, 2^2147483647),支持的小数位(标度)范围为-2147483648 ~ +2147483647,标度为负数时代表对应数值是10的标度绝对值次方的整数倍,完全覆盖普通计算器、甚至专业科学计算的数值范围需求。
开发提示:初始化
BigDecimal时不要直接传入double类型值,会把double本身的精度误差带入对象,优先使用字符串参数的构造方法,比如new BigDecimal("0.1")就能得到精确的0.1值。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

