蓝桥杯-小数运算,保留小数点

本文介绍Java中float与double的区别,包括内存占用、运算速度及精度,并通过两个实例展示如何使用String.format进行小数点后位数的保留。

java 中默认小数声明是double; 

如:float x = 1.0;报错;需要写:float x = 1.0f;

* float表示单精度浮点数在机内占4个字节,用32位二进制描述
* double表示双精度浮点数在机内占8个字节,用64位二进制描述

* 对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,java语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

保留小数点:

方法一:

double d = 3.1415926;
String result = String .format("%.2f",d);
%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型。


题目一:

历史上有许多计算圆周率pai的公式,其中,格雷戈里和莱布尼茨发现了下面的公式:
pai = 4*(1-1/3+1/5-1/7 ....)
这个公式简单而优美,但美中不足,它收敛的太慢了。
如果我们四舍五入保留它的两位小数,那么:
累积1项是:4.00
累积2项是:2.67
累积3项是:3.47
。。。
请你写出它累积100项是多少(四舍五入到小数后两位)。
注意:只填写该小数本身,不要填写任何多余的说明或解释文字。


public class test
{
	public static void main(String[] args)
	{
		float sum = 0;
		for (float i = 1; i <= 100; i++) {
			if (i%2!=0) {
				sum += 1.0f/(i*2-1);
			}else {
				sum -= 1.0f/(i*2-1);
			}
			String result = String.format("%.2f", sum*4);
			System.out.println(result);
		}
	}

}


-----------------------------------------------------------------------------------------------------------------------------------------------------------------

保留小数点方法二:

  public static String formatDouble4(double d) {
        DecimalFormat df = new DecimalFormat("#.00");
        return df.rmat(d);//string类型
    }
public class Main {
	public static void main(String[] args) {
		String aString = "2.34";
		float a = Float.parseFloat(aString);//string 类型和float 转换
		System.out.println(a);
	}
}
--------------------------------
题目二:

无穷分数

无穷的分数,有时会趋向于固定的数字。
请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。

请填写该浮点数,不能填写任何多余的内容。

/*递归和小数运算*/
public class test
{
	public static void main(String[] args)
	{
		float a= digui(1.0f);
		String result = String.format("%.5f", a);
		System.out.println(result);
	}

	private static float digui(float f) {
		// TODO Auto-generated method stub
		if (f==100.0f) {
			return f;
		}
		return f/(f+digui(f+1));
	}
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------


有些精度高的必须用double类型;


1/1 + 1/2 + 1/3 + 1/4 + ... 在数学上称为调和级数。

它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。

但是,它发散的很慢:

前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0

public class test {

	public static void main(String[] args) {
		double sum = 0;
		double i = 1.0d;
		int count = 0;
		while (sum<15.0) {
			sum+=1.0d/i;
			i++;
			count++;
		}
		System.out.println(count);
	}

}



### 蓝桥杯单片机 DS18B20 温度显示小数实现方法 #### 一、DS18B20的工作原理 DS18B20是一种高精度的数字温度传感器,能够提供9至12位分辨率的温度数据。其测量范围为-55°C至+125°C,在12位模式下分辨率为±0.0625°C[^1]。 当获取到的温度值是以二进制形式表示时,高位部分代表整数部分,低位部分则用于计算小数部分。具体来说,对于12位分辨率的数据格式,低4位用来表达小数值。例如,如果读取到的结果是`7F A0 H`(即十进制中的127.625),其中`A0H`对应的小数部分可以通过如下方式解析: ```c float temperature = (int_part + float_part); // int_part 是由高字节转换而来的整数部分; // float_part 则是由低四位除以16得到的小数部分。 ``` #### 二、软件设计要点 为了正确处理并显示出带有小数点后的精确温度值,可以采用C语言编写相应的算法来完成这一过程。以下是几个重要的编程环节说明以及代码片段展示: ##### 数据采集函数 利用已有的单总线驱动库或者自行编写的通信协议与DS18B20交互,启动一次温度转换操作,并等待完成后读回结果。 ```c void read_temperature(uint8_t *temp_high, uint8_t *temp_low){ // 初始化单总线连接... // 发送命令给DS18B20开始新的一轮温度采样... delay_ms(750); // 延迟足够时间让器件完成内部运算 // 接收来自设备返回的两个寄存器内容分别存储于*temp_high 和 *temp_low 中... } ``` ##### 小数提取逻辑 根据上述提到的数据结构特点,分离出完整的浮点型变量供后续打印或其他用途调用。 ```c #include <stdio.h> double get_float_temp(uint8_t temp_h, uint8_t temp_l){ signed char sign; double result; if(temp_h & 0x80){ /* 如果最高有效位被置位,则表明当前温度低于零 */ sign=-1; temp_h=~temp_h; temp_l=~temp_l; }else{ sign=1; } result=(sign)*(((unsigned short)(temp_h<<8 | temp_l))>>4); if(sign<0 && ((temp_h<<8|temp_l)&0xF)){ --result;// 补偿负号情况下的误差修正 } return result/16.0f; } ``` 以上实现了从小端序接收到的大端序列化数据中恢复原始物理量的功能,同时兼顾正负两种情形的不同表现形式[^2]。 #### 三、实际应用案例分析 假设现在有一个基于STC系列MCU开发板制作而成的作品需要加入环境监控功能,那么就可以按照前述步骤依次执行初始化外设资源->周期性触发ADC通道切换扫描目标区域内的热敏电阻变化趋势的同时也同步记录下来自远端节点上传过来的标准工业级探头所反馈回来的信息作为对比参照系之一;最后再借助LCD显示屏直观呈现出来便于观察者及时获知最新动态状况。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

obession

觉得有用可以打赏咖啡一杯~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值