从非正规格式的输入数得到正规输入格式

本文介绍了如何从Android的EditText控件中读取并处理数字输入。内容涵盖整数及浮点数的转换方法,包括使用String与int/long/double类型的相互转换,通过正则表达式验证输入的有效性,以及利用字符串操作去除前导零等技巧。

读取输入框Editext中输入的数字格式的文本,获得一个正确的数字格式的数的字符串;然后按照其他步骤使用该字符串:

得到数字的方法

1)如果是整数类型(不含小数点)的数字,可以根据情况使用String与int/long类型的转换得到相应的整数

private EditText et;

    String strEt = et.getText().toString();//转化为int去掉最前面的无意义的0
			int m = Integer.valueOf(strEt);
			strEt = Integer.toString(m);
//			long l = Long.valueOf(str);
//			str = Long.toString(l);

2)利用浮点数类型,获得整数部分,可以用相类似的方法:

   strEt = et.getText().toString();
			double d = Double.parseDouble(strEt);
			strEt = Double.toString(d);
			// Math.floor(d); //取整得到如4.0;
			strEt = Double.toString(d);
	        strEt.substring(0, strEt.indexOf("."));

3)类似(2)得到浮点类型的数(切要求保留int i位小数的值):
可以用转换的double值,d乘以相应的(Double)(10^i),取整然后再除改(10^i)即可;
4)使用正则表达式:
String regex =“\\[1-9]\\d*\\.\\d*"和 regex2 = ”0\\.\\d*"
if(regex匹配)    //无匹配时说明输入的数整数部分为0
else if(采用regex2匹配)//仍无匹配则输入的为0
else 输入的为0
5)直接使用字符串进行下一步操作, 首先设置一个boolean值,从首位字符开始读取字符串strEt,用来判断是否读到'0'之外的字符,当读到非'0'字符时开始执行操作(当第一个非'0'字符为'.'时,首先补一个0)
6)使用String的replace( )方法进行操作:
str = str.replace('0', ' ');//将0变为空格,并在最后追加一个保护字符
str = str.trim();//将最前面的空格去掉,再将保护字符去掉
str = str.replace( " ","0");//将空格转换回0




### 非正规的定义与背景 在计算机浮点运算中,非正规(denormalized number,也称为次正规,subnormal number)是用于表示常接近零但小于最小正规浮点的一类值。IEEE 754 浮点标准中引入了非正规的概念,以确保浮点在接近零的区间内仍然能够保持一定的精度和连续性[^1]。 在正规浮点表示中,有效字(尾)部分总是以一个隐含的前导 1 开头(例如,对于单精度浮点格式为 `±1.xxx...x × 2^e`)。然而,当指部分达到最小值(即无法再减小)时,继续表示更小的值将无法通过调整指实现。为了解决这一问题,非正规允许尾部分不再以 1 开头,而是以 0 开头,从而扩展了浮点可以表示的最小值范围。 ### 非正规的用途 非正规的主要用途是避免在两个常接近的浮点之间出现“突然下溢”(flush to zero)的情况,从而保持浮点运算的连续性和稳定性。例如,在科学计算、信号处理或音频合成等场景中,非正规可以防止因舍入误差导致的计算中断或不稳定行为。 非正规的使用也带来了性能上的代价。由于它们的处理通常需要额外的硬件支持或软件模拟,因此在某些系统中,处理非正规的速度显著低于处理正规的速度。这也是为什么在某些高性能计算场景中会通过 `-ffast-math` 等编译器选项来禁用对非正规的支持,以换取更高的运算效率。 ### 非正规的示例 以下是一个简单的 C 语言示例,展示了非正规的生成和表现: ```c #include <stdio.h> #include <float.h> #include <math.h> int main() { float min_normalized = FLT_MIN; // 最小正规浮点 float denormalized = min_normalized / 2.0f; printf("Minimum normalized float: %e\n", min_normalized); printf("Denormalized float: %e\n", denormalized); if (denormalized != 0.0f) { printf("Denormalized value is not zero.\n"); } else { printf("Denormalized value flushed to zero.\n"); } return 0; } ``` 在支持非正规的系统上,输出将显示 `denormalized value is not zero.`;而在某些优化配置下(如启用 `-ffast-math`),输出可能显示为 `flushed to zero`,表明非正规被强制转换为零。 ### 非正规的处理与优化 现代处理器通常提供对非正规的硬件支持,但在某些情况下,例如 GPU 计算或嵌入式系统中,非正规的处理可能会被关闭以提高性能。此外,某些编译器优化选项(如 `-ffast-math`)会隐式地启用“刷新非正规到零”(Flush to Zero, FTZ)和“非正规输入视为零”(Denormals Are Zero, DAZ)的行为,从而避免非正规带来的性能开销。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值