1. 小数
来回忆下我们的项目——比如说是个最简单的计算器。或者任何需要算数的程序(从算钱到复杂的物理模拟都行)。现实生活里很多东西都不是整数,这没办法!
所以我们得用上新的数据类型啦!
在编程里,小数还叫做浮点数,或者带小数点的数(floating-point)。在C#里,跟大多数语言一样,它们用来存不光是整数,还有各种“小数”:像3.14、-28.57、2.718281828这种...
浮点数主要有两种类型:
| 类型 | 存啥 | 数值范围(大概) | 精度 | 典型大小 |
|---|---|---|---|---|
|
数字 | ±1.5 × 10-45 ... ±3.4 × 1038 | ~小数点后7位 | 4字节 |
|
数字 | ±5.0 × 10-324 ... ±1.7 × 10308 | ~小数点后15-16位 | 8字节 |
float类型
float这个名字来自floating-point number——带小数点的数。数学里的浮点数有很多特性,但计算机有很多限制。所以其实在C#里叫它“浮点数”更准确点。
float类型一般能存7位有效数字(比如0.1234567),还有指数部分,占4字节内存。这个精度其实不高,所以大家都更喜欢用双精度的数。
2. double类型变量的声明和初始化
和int差不多——只是现在用double。
// 声明变量并赋值为圆周率
double pi = 3.1415926;
// 也可以先声明,不初始化
double averageSalary;
averageSalary = 91234.56;
// 还能做运算!
double pizzaPieces = 8;
double friends = 3;
double piecesPerFriend = pizzaPieces / friends; // 2.666...(不是2)
语法小细节:
- 小数点要用点(3.14)。用逗号会报错!
- 严格来说,写double d = 3;不会报错——类型会自动转换(整数变成“浮点数”,不会丢精度)。
3. 用Console输入输出浮点数
先来输出个小数:
double amount = 42.75;
Console.WriteLine(amount); // 输出:42.75
没问题!加点文字试试:
Console.WriteLine("你的账户余额: " + amount + " 欧元。"); // 你的账户余额: 42.75 欧元。
键盘输入
重点:Console.ReadLine()总是返回字符串,要把它转成double类型。
Console.WriteLine("请输入窗外温度:");
string input = Console.ReadLine();
double temperature = double.Parse(input); // 字符串转double
Console.WriteLine("外面现在: " + temperature + " 度。");
4. double类型实战:算术运算
所有常见运算(+、-、*、/)都和int一样用法:
double distance = 100.5;
double time = 2.0;
double speed = distance / time; // 50.25
Console.WriteLine("平均速度: " + speed); // 平均速度: 50.25
这就是全部的算术啦。唯一的区别:只要有一个操作数是double,结果一定是小数。
和int对比下
int a = 5, b = 2;
Console.WriteLine(a / b); // 2(小数部分被扔掉了)
double aa = 5, bb = 2;
Console.WriteLine(aa / bb); // 2.5
5. 用double时常见的坑和奇怪现象
字符串转换错误
经典场景:用户输入3,14,但程序等着3.14。
// 如果输入"3,14"会报错
double value = double.Parse(Console.ReadLine());
如果你在用逗号做小数点的国家(比如波兰、德国),double.Parse能正常工作。但如果程序用的是“英文”设置,那就得用点。
计算机里的“不精确”问题
新手经常会一脸懵逼:
double x = 0.1 + 0.2;
Console.WriteLine(x); // 咦... 0.30000000000000004
恭喜你,遇到浮点数在计算机里的“魔法”了。其实很多小数在二进制里根本没法精确表示。下节课会详细聊,这里先别慌!大多数应用场景都没啥大问题,但做金融或科学计算要注意。
6. 重点:double和int——自动和强制类型转换
有时候你会把整数和小数加起来,或者把int赋值给double变量——不会报错:
int i = 2;
double d = i; // 没问题!
Console.WriteLine(d); // 2
double dd = 3.7;
int ii = (int) dd; // 要手动把double转成int!
Console.WriteLine(ii); // 3,小数部分被扔掉了
很多人会奇怪——为啥转完小数部分没了?因为int类型根本存不了小数(点后面的都直接消失)。
下节课会详细聊double转int和(int)操作符。
7. 格式化输出:让double更好看
很多时候double默认输出一堆没用的零。可以格式化一下:
double temp = 23.56789;
Console.WriteLine(temp); // 23.56789
Console.WriteLine(temp.ToString("F2")); // 23.57(小数点后2位)
Console.WriteLine($"{temp:F1}"); // 23.6(字符串插值)
| 格式 | 结果 | 说明 |
|---|---|---|
| "F0" | 24 | 没有小数部分 |
| "F2" | 23.57 | 小数点后两位 |
| "F5" | 23.56789 | 小数点后五位 |
GO TO FULL VERSION