文章目录
- 前言
- 一、浮点型(float和double)
- 1.float类型
- 2.double类型
- 二、保留小数的方法
- 方法一:
- 方法二:
- 三、样题讲解
- 问题1:1603. 冷饮的价格?
- 问题2:1957. 求三个数的平均数
- 问题3:1602. 总分和平均分
- 问题4:1598. 文具店的折扣
- 问题5:1601. 挖胡萝卜
- 四、总结
- 五、感谢
前言
欢迎步入C++程序设计的奇妙世界,本章节我们将聚焦于编程领域中一个至关重要且广泛使用的数据类型——浮点数。浮点数,作为数学和现实世界计量不可或缺的一部分,在计算机科学中扮演着举足轻重的角色。无论是精确的科学计算,还是日常的金融交易记录,正确理解和运用浮点数都是编程技能中的一项基本功。本章节将引领你深入了解C++中的浮点型数据——float与double,揭示它们的存储细节、精度差异以及如何在实际编程中灵活应用它们进行精确或高效的数值处理。让我们一同揭开浮点数的神秘面纱,为你的编程之旅增添一份坚实的基石。
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
一、浮点型(float和double)
浮点数是小数点在逻辑上是不固定的数,并不一定等于小数。
在C++中,我们有两种主要的浮点数据类型:float和double。它们的主要区别在于存储大小和精度。float通常使用32位来存储,而double则使用64位。
你可以把float想象成一个普通的杯子,而double则是一个大杯子。当你需要装一点果汁时,普通的杯子就足够了。但是,如果你需要装很多果汁,或者你需要确保果汁的每一滴都精确无误,那么你就需要一个大杯子,也就是double。
1.float类型
- 它用于表示单精度浮点数。
- 通常,它使用32位内存,其中大约24位用于表示小数部分,8位用于表示指数部分。这意味着它能提供大约6-7位有效数字的精度。
- float类型的变量可以存储从大约1.2E-38到3.4E+38之间的数值。
float 示例
#include <iostream>
using namespace std;
int main() {
// 声明并初始化float类型的变量
float pi_float = 3.14159f; // 注意末尾的 'f' 或 'F' 表示这是一个float类型的字面值
// 输出float类型的变量
cout << "The value of pi as a float: " << pi_float << endl;
return 0;
}
在这个例子中,我们声明了一个名为pi_float的float类型变量,并将其初始化为3.14159。由于直接写的3.14159默认会被认为是double类型的字面值,所以在赋值给float变量时,我们需要在数值后面加上f或F来明确指出这是一个float类型的数值。
2.double类型
- 它用于表示双精度浮点数,提供了比float更高的精度。
- 通常,double占用64位内存,其中53位用于小数部分,11位用于指数部分。这使得double能够精确到大约15-16位有效数字。
- double类型的变量可以存储从大约2.2E-308到1.8E+308之间的数值。
double 示例
#include <iostream>
using namespace std;
int main() {
// 声明并初始化double类型的变量
double pi_double = 3.141592653589793; // 对于double,不需要像float那样在数值后加标识符
// 输出double类型的变量
cout << "The value of pi as a double: " << pi_double << endl;
return 0;
}
在这个例子中,我们声明了一个名为pi_double的double类型变量,并直接将其初始化为3.141592653589793。因为double是处理浮点数时的默认类型,所以可以直接赋值而不需添加任何后缀。
二、保留小数的方法
方法一:
- 引入头文件 #include < iomanip>
- 输出格式:cout<<fixed<<setprecision(保留几位填数字几)<<输出<<endl;
示例
#include <iostream>
#include <iomanip> // 引入iomanip头文件以使用fixed和setprecision
using namespace std;
int main() {
double number = 3.14159;
// 使用fixed确保小数点后固定位数,setprecision设置保留的小数位数
cout << fixed << setprecision(2) << number << endl;
return 0;
}
在这个例子中,number的值为3.14159,通过fixed和setprecision(2),输出结果会是3.14,即保留了两位小数。
几点注意:
- fixed确保小数点后有固定数量的数字,即使它们是0。
- setprecision(n)设置输出浮点数的精度为n位小数,但如果不与fixed一起使用,它可能不会以预期的方式工作,尤其是在数值较小或较大的情况下。
- 这些操作只影响输出的显示方式,并不影响变量本身的值。
方法二:
printf(“%.1f”,)是C语言中的格式化输出函数,用于将浮点数按照指定格式输出。其中%.1f表示输出浮点数,保留小数点后1位。在括号中填入需要输出的浮点数即可。
- 输出格式:printf(“%.1f”,输出);
示例
#include <cstdio> // 在C++中,为了使用printf,需要包含<stdio.h>或<stdio>
int main() {
double number = 3.14159;
// 使用printf函数输出,%.1f指保留1位小数
printf("%.1f\n", number); // 注意\n用于换行
return 0;
}
在这个例子中,%.1f是一个格式说明符,其中%是所有格式说明符的开始标志,.1表示保留一位小数,f指示要输出的是浮点数。printf函数会将number的值按照这个格式输出。
三、样题讲解
问题1:1603. 冷饮的价格?
类型:基本运算、小数数运算
题目描述:
暑假来了,天气特别热,花花到冷饮店来买冷饮;已知雪糕 2.5 元 / 支,碎碎冰 1.5 元 / 支,花花买了 x 支雪糕和 y 支碎碎冰,老板说今天有优惠,可以有 1 支雪糕免费,请问花花应该付给老板多少钱?
输入:
两个整数 x 和 y ,分别代表了雪糕和碎碎冰的购买数量。
输出:
一个小数,代表了花花应付给老板的金额(结果保留 1 位小数)。
样例:
输入:
3 5
输出:
12.5
1.分析问题
- 已知:花花买了 x 支雪糕和 y 支碎碎冰。
- 未知:花花应该付给老板多少钱?
- 关系:总价=单价*数量。
2.定义变量
- 定义整型变量x、y,分别存储雪糕和碎碎冰的数量。
- 定义双精度浮点型变量p,用于存储计算出的总金额(初始值为0)。
// 二、数据定义
int x, y;
double p = 0;
3.输入数据
- 从标准输入(如键盘)读取雪糕和碎碎冰的数量,并分别赋值给x、y。
// 三、数据输入
cin >> x >> y;
4.数据计算
- 计算总金额,其中雪糕单价为2.5元,碎碎冰单价为1.5元;第一支雪糕免费,所以雪糕数量减1后再乘以单价。
// 四、数据计算
p = (x - 1) * 2.5 + y * 1.5;
5.输出结果
- 设置输出格式为固定小数点、保留1位小数,然后输出总金额p。
// 五、输出结果
cout << fixed << setprecision(1) << p;
完整代码如下:
#include <bits/stdc++.h> // 包含C++标准库的头文件集合
using namespace std; // 使用std命名空间,简化后续代码中对标准库对象的引用
int main() { // 定义主函数
// 一、分析问题
// 已知:花花买了 x 支雪糕和 y 支碎碎冰。
// 未知:花花应该付给老板多少钱?
// 关系:总价=单价*数量。
// 二、数据定义
int x, y; // 定义整型变量x、y,分别存储雪糕和碎碎冰的数量
double p = 0; // 定义双精度浮点型变量p,用于存储计算出的总金额(初始值为0)
// 三、数据输入
cin >> x >> y; // 从标准输入(如键盘)读取雪糕和碎碎冰的数量,并分别赋值给x、y
// 四、数据计算
p = (x - 1) * 2.5 + y * 1.5; // 计算总金额,其中雪糕单价为2.5元,碎碎冰单价为1.5元;第一支雪糕免费,所以雪糕数量减1后再乘以单价
// 五、输出结果
cout << fixed << setprecision(1) << p; // 设置输出格式为固定小数点、保留1位小数,然后输出总金额p
return 0; // 主函数返回0,表示程序正常结束
}
问题2:1957. 求三个数的平均数
类型:基本运算、小数运算
题目描述:
小雅刚刚考完语文、数学、英语的三门期中考试,她想请你编个程序来帮她算算她的平均分。
要求输入三个正整数,分别表示三科考试的分数,输出它们的平均值。
输入:
一行,包括三个正整数,两两之间用一个空格分隔。
输出:
一个数,表示输入的三个数的平均值。(注意:结果请保留 3 位小数)。
样例:
输入:
75 88 99
输出:
87.333
1.分析问题
- 已知:语文、数学、英语的三门期中考试成绩。
- 未知:平均分。
- 关系:求平均分公式。
2.定义变量
- 定义整型变量yw、sx、yy,分别存储语文、数学、英语的成绩
- 定义双精度浮点型变量avg,用于存储计算出的平均分
// 二、数据定义
int yw, sx, yy;
double avg;
3.输入数据
- 从标准输入(通常为键盘)读取三个整数值,并将它们分别赋值给变量 yw、sx 和 yy。
// 三、数据输入
cin >> yw >> sx >> yy;
4.数据计算
- 通过将三科成绩相加后除以3.0(一个浮点数,确保结果为浮点数),计算得到平均分,并将结果存入变量 avg。
// 四、数据计算
avg = (yw + sx + yy) / 3.0;
5.输出结果
-
cout:它是用于标准输出(通常为控制台屏幕)的对象。
-
fixed:这个操纵符设置浮点数输出模式为定点表示法,确保小数点始终存在。
-
setprecision(3):该操纵符指定小数点后显示的位数,此处设置为3位。
-
<< avg:最后,将计算得出的平均分(avg)打印到控制台。
// 五、输出结果
cout << fixed << setprecision(3) << avg;
return 0; // 主函数返回0,表示程序正常结束
完整代码如下:
#include <bits/stdc++.h> // 包含C++标准库的头文件集合
using namespace std; // 使用std命名空间,简化后续代码中对标准库对象的引用
int main() { // 定义主函数
// 一、分析问题
// 已知:语文、数学、英语的三门期中考试成绩
// 未知:平均分
// 关系:求平均分公式
// 二、数据定义
int yw, sx, yy; // 定义整型变量yw、sx、yy,分别存储语文、数学、英语的成绩
double avg; // 定义双精度浮点型变量avg,用于存储计算出的平均分
// 三、数据输入
cin >> yw >> sx >> yy; // 从标准输入(如键盘)读取三科成绩,并分别赋值给yw、sx、yy
// 四、数据计算
avg = (yw + sx + yy) / 3.0; // 计算三科成绩之和除以3.0(确保浮点数结果),并将结果存入avg
// 五、输出结果
cout << fixed << setprecision(3) << avg; // 设置输出格式为固定小数点、保留3位小数,然后输出平均分avg
return 0; // 主函数返回0,表示程序正常结束
}
问题3:1602. 总分和平均分
类型:基本运算、小数运算
题目描述:
期末考试成绩出来了,小明同学语文、数学、英语分别考了 x、y、z 分,请编程帮助小明计算一下,他的总分和平均分分别考了多少分?
输入:
三个整数 x、y、z 分别代表小明三科考试的成绩。
输出:
第 1 行有一个整数,代表总分。
第 2 行有一个小数(保留 1 位小数)代表平均分。
样例:
输入:
100 95 91
输出:
286
95.3
1.分析问题
- 已知:小明同学语文、数学、英语分别考了 x、y、z 分。
- 未知:他的总分和平均分分别考了多少分?
- 关系:求和sum=x+y+z和求平均分avg= sum/3.0。
2.定义变量
- 定义整型变量x、y、z,分别存储语文、数学、英语的成绩;定义整型变量sum,用于存储总分(初始值为0)。
- 定义双精度浮点型变量avg,用于存储计算出的平均分。
// 二、数据定义
int x, y, z, sum = 0;
double avg;
3.输入数据
- 从标准输入(如键盘)读取语文、数学、英语的成绩,并分别赋值给x、y、z。
// 三、数据输入
cin >> x >> y >> z;
4.数据计算
- 计算总分,即将三科成绩相加。
- 计算平均分,即总分除以3.0(确保浮点数结果),并将结果存入avg。
// 四、数据计算
sum = x + y + z;
avg = sum / 3.0;
5.输出结果
- 输出总分。
- 设置输出格式为固定小数点、保留1位小数,然后输出平均分avg。
// 五、输出结果
cout << sum << endl;
cout << fixed << setprecision(1) << avg;
完整代码如下:
#include <bits/stdc++.h> // 包含C++标准库的头文件集合
using namespace std; // 使用std命名空间,简化后续代码中对标准库对象的引用
int main() { // 定义主函数
// 一、分析问题
// 已知:小明同学语文、数学、英语分别考了 x、y、z 分
// 未知:他的总分和平均分分别考了多少分?
// 关系:求和sum=x+y+z和求平均分avg= sum/3.0
// 二、数据定义
int x, y, z, sum = 0; // 定义整型变量x、y、z,分别存储语文、数学、英语的成绩;定义整型变量sum,用于存储总分(初始值为0)
double avg; // 定义双精度浮点型变量avg,用于存储计算出的平均分
// 三、数据输入
cin >> x >> y >> z; // 从标准输入(如键盘)读取语文、数学、英语的成绩,并分别赋值给x、y、z
// 四、数据计算
sum = x + y + z; // 计算总分,即将三科成绩相加
avg = sum / 3.0; // 计算平均分,即总分除以3.0(确保浮点数结果),并将结果存入avg
// 五、输出结果
cout << sum << endl; // 输出总分
cout << fixed << setprecision(1) << avg; // 设置输出格式为固定小数点、保留1位小数,然后输出平均分avg
return 0; // 主函数返回0,表示程序正常结束
}
问题4:1598. 文具店的折扣
类型:基本运算、小数运算
题目描述:
花花去文具店买了 1 支笔和 1 块橡皮,已知笔x元/ 支,橡皮 y 元 / 块,文具店今天有活动,可以给顾客打 9 折(用购买总价×0.9 ),花花付给了老板 n 元,请问老板应该找给花花多少钱?
输入:
三个整数x、y、n ,分别代表了笔的单价、橡皮的单价和花花付给老板的钱(已知花花付给老板的钱 n≥x+y)。
输出:
一个小数(保留 1 位小数),代表老板应该找给花花的钱。
样例:
输入:
2 1 5
输出:
2.3
1.分析问题
- 已知:买了 1 支笔和 1 块橡皮,笔x元/支,橡皮 y 元 / 块,打 9 折。
- 未知:花花付给了老板 n 元,请问老板应该找给花花多少钱m?
- 关系:找零金额m = 实际支付金额n - 应付金额,其中应付金额为(x + y)元 × 0.9(9折)。
2.定义变量
- 定义整型变量x、y,分别存储笔和橡皮的单价;定义整型变量n,存储花花实际支付的金额。
- 定义双精度浮点型变量m,用于存储计算出的找零金额。
// 二、数据定义
int x, y, n;
double m;
3.输入数据
- 从标准输入(如键盘)读取笔和橡皮的单价以及花花实际支付的金额,并分别赋值给x、y、n。
// 三、数据输入
cin >> x >> y >> n;
4.数据计算
- 计算找零金额,即实际支付金额减去应付金额(笔和橡皮总价的9折)。
// 四、数据计算
m = n - (x + y) * 0.9;
5.输出结果
- 设置输出格式为固定小数点、保留1位小数,然后输出找零金额m。
// 五、输出结果
cout << fixed << setprecision(1) << m;
完整代码如下:
#include <bits/stdc++.h> // 包含C++标准库的头文件集合
using namespace std; // 使用std命名空间,简化后续代码中对标准库对象的引用
int main() { // 定义主函数
// 一、分析问题
// 已知:买了 1 支笔和 1 块橡皮,笔x元/支,橡皮 y 元 / 块,打 9 折
// 未知:花花付给了老板 n 元,请问老板应该找给花花多少钱m?
// 关系:找零金额m = 实际支付金额n - 应付金额,其中应付金额为(x + y)元 × 0.9(9折)
// 二、数据定义
int x, y, n; // 定义整型变量x、y,分别存储笔和橡皮的单价;定义整型变量n,存储花花实际支付的金额
double m; // 定义双精度浮点型变量m,用于存储计算出的找零金额
// 三、数据输入
cin >> x >> y >> n; // 从标准输入(如键盘)读取笔和橡皮的单价以及花花实际支付的金额,并分别赋值给x、y、n
// 四、数据计算
m = n - (x + y) * 0.9; // 计算找零金额,即实际支付金额减去应付金额(笔和橡皮总价的9折)
// 五、输出结果
cout << fixed << setprecision(1) << m; // 设置输出格式为固定小数点、保留1位小数,然后输出找零金额m
return 0; // 主函数返回0,表示程序正常结束
}
问题5:1601. 挖胡萝卜
类型:基本运算、小数运算
题目描述:
小兔朱迪挖了 x 个胡萝卜,狐狸尼克挖到胡萝卜数量是小兔挖到的 3 倍,小羊肖恩挖到胡萝卜的数量比狐狸尼克少 8 个。
请你编程计算一下狐狸尼克和小羊肖恩分别挖了几个胡萝卜,以及平均每个动物挖了几个胡萝卜?
输入:
一个整数 x 代表小兔挖走的胡萝卜的数量。
输出:
三个数,每行 1 个,第 1 个整数代表狐狸尼克挖走的胡萝卜的数量,第 2 个整数代表小羊肖恩挖走的胡萝卜的数量,第 3 个数是小数代表平均每个动物挖走了几个胡萝卜(结果保留1位小数)。
样例:
输入:
10
输出:
30
22
20.7
1.分析问题
- 已知:兔子t挖了x个胡萝卜。狐狸h挖的胡萝卜数量是兔子的3倍。小羊y挖的胡萝卜数量比狐狸少8个。
- 未知:狐狸h和小羊y各自挖了多少个胡萝卜。兔子、狐狸和小羊三者平均每人挖了多少个胡萝卜(保留一位小数)。
- 关系:h=3*t,y=h-8,avg=(t+h+y)/3 。
2.定义变量
- int t:表示兔子挖胡萝卜的数量(整数类型)。
- int h:表示狐狸挖胡萝卜的数量(整数类型)。
- int y:表示小羊挖胡萝卜的数量(整数类型)。
- double avg:表示兔子、狐狸和小羊挖胡萝卜的平均数量(浮点数类型)。
//二、数据定义
int t,h,y;
double avg;
3.输入数据
- 从标准输入(通常是键盘)接收一个整数,存储到变量t中,即兔子挖胡萝卜的数量。
//三、数据输入
cin>>t;
4.数据计算
- 计算狐狸挖胡萝卜的数量:h = t * 3。
- 计算小羊挖胡萝卜的数量:y = h - 8。
- 计算三者平均挖胡萝卜的数量:avg = (t + h + y) / 3.0。注意除以3.0是为了确保结果为浮点数。
//四、数据计算
h=t*3;
y=h-8;
avg=(t+h+y)/3.0;
5.输出结果
//五、输出结果
cout<<h<<endl<<y<<endl;
cout<<fixed<<setprecision(1)<<avg;
完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 一、分析问题
// 已知:
// 1. 兔子t挖了x个胡萝卜。
// 2. 狐狸h挖的胡萝卜数量是兔子的3倍。
// 3. 小羊y挖的胡萝卜数量比狐狸少8个。
// 未知:
// 1. 狐狸h、小羊y挖了多少个胡萝卜?
// 2. 兔子、狐狸和小羊平均每人挖了多少个胡萝卜(保留一位小数)。
// 关系:
// h = 3 * t
// y = h - 8
// avg = (t + h + y) / 3.0
// 二、数据定义
int t, h, y; // 定义整型变量t、h、y分别表示兔子、狐狸、小羊挖胡萝卜的数量
double avg; // 定义双精度浮点型变量avg表示平均挖胡萝卜数量
// 三、数据输入
cin >> t; // 从标准输入读取兔子挖胡萝卜的数量并存储到变量t中
// 四、数据计算
h = t * 3; // 根据关系式计算狐狸挖胡萝卜的数量
y = h - 8; // 根据关系式计算小羊挖胡萝卜的数量
avg = (t + h + y) / 3.0; // 计算三者平均挖胡萝卜数量,除以3.0确保结果为浮点数
// 五、输出结果
cout << h << endl; // 输出狐狸挖胡萝卜的数量
cout << y << endl; // 输出小羊挖胡萝卜的数量
cout << fixed << setprecision(1) << avg; // 设置输出格式,保留一位小数后输出平均数
return 0; // 程序正常结束,返回值为0
}
四、总结
通过本章节的深入探索,我们不仅掌握了C++中浮点数的基础知识,还学会了如何在不同的应用场景中恰当地选择使用float或double。了解到float作为一种节省内存的方案,适合处理对精度要求不高的浮点运算,而double则以其更高的精度成为大多数精密计算的首选。我们还实践了两种保留小数的方法:利用库中的fixed和setprecision控制输出精度,以及通过C语言风格的printf函数精确格式化输出。
五、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!