dart

Dart 基础 – 内置类型 – 数字

内容纲要

版权归作者 ©刘龙宾 所有,本文章未经作者允许,禁止私自转载!

在 Dart 语言中,提供了 intdouble 两种数字类型。其中 int 用来表示整数数字double 用来表示包含小数点的数字。它们都继承自 num 抽象类,具体关系如下图所示:

1. int 和 double

在实际开发中,如果希望明确定义不包含小数位的整数数字,可以使用 int 类型,示例代码如下:

void main(List<String> args) {
  int age = 10;
  print(age); // 输出 10
}

如果希望明确定义包含小数位的数字,可以使用 double 类型,示例代码如下:

void main(List<String> args) {
  double price = 5.5;
  print(price); // 输出 5.5
}

从 Dart 2.1 开始,必要的时候 int 字面量会自动转换double 类型,示例代码如下:

void main(List<String> args) {
  // 1. 把 int 字面量 10 赋值给 double 类型的变量 price
  double price = 10;
  // 2. 输出 price 的值,发现变成了包含小数位的 double 类型的值:10.0
  print(price);
}

2. 父类型 num

在定义数字的时候,无论是 int 还是 double 类型的数字,都可以使用父类型 num 来表示,示例代码如下:

void main(List<String> args) {
  // 定义 num 类型的变量 a 和 b,其中:
  // 为变量 a 赋值整数 10
  num a = 10;
  // 为变量 b 赋值带小数的数字 1.1
  num b = 1.1;
}

因此在实际开发中,如果某个数字的类型不明确,推荐使用父类型 num 来表示,示例代码如下:

void main(List<String> args) {
  // 1. 定义数字类型的变量 price,具体是小数还是整数不明确
  num price;

  // 2. 为 price 赋值为整数 10
  price = 10;
  print(price); // 输出 10

  // 3. 为 price 赋值为带小数的数字 1.1
  price = 1.1;
  print(price); // 输出 1.1
}

3. int 与 double 进行运算

int 类型的字面量与 double 类型的字面量进行运算,最终得到的结果为 double 类型,示例代码如下:

void main(List<String> args) {
  num result = 10 + 1.1;
  print(result); // 输出 11.1

  // 注意:Dart 中的 is 是类型判断操作符,用来判断左侧的数据是否为右侧的类型,语法如下:
  // 数据 is 类型
  // 如果返回 true,则表示左侧数据是右侧类型;如果返回 false,则表示左侧数据不是右侧类型。
  print(result is int); // 输出 false,表示运算的结果不是 int 类型
  print(result is double); // 输出 true,表示运算的结果是 double 类型
}

4. 字符串转数字

如果希望把字符串转换为数字,可以调用 intdoublenum 的类提供的静态方法 parse(字符串),示例代码如下:

void main(List<String> args) {
  int a = int.parse('10');
  print(a); // 输出 10

  double b = double.parse('1.1');
  print(b); // 输出 1.1

  num c = num.parse('20');
  print(c); // 输出 20
  print(c is int); // 输出 true

  num d = num.parse('2.2');
  print(d); // 输出 2.2
  print(d is double); // 输出 true
}

在调用 parse() 把字符串转为数字的过程中,可能会出现转换失败导致程序运行异常的问题。为了防止异常报错,可以使用 tryParse() 静态方法进行转换。示例代码如下:

void main(List<String> args) {
  // 1. 如果转换成功,则转换的结果是预期的数字
  int? a = int.tryParse('10');
  print(a); // 输出 10

  // 2. 如果转换失败,则转换的结果是 null,从而防止程序运行异常的问题
  // 注意:这里的 int? 表示"可空 int 类型":表示变量的值既可以是 int 整数,也可以是 null
  int? b = int.tryParse('10全大补汤');
  print(b); // 输出 null
}

注意:int.parse() 只能转换 int 整数,在使用 int.parse() 转换带小数点的数字时会报错,例如下面的代码在运行时会产生异常

void main(List<String> args) {
  // Unhandled exception:
  // FormatException: Invalid radix-10 number (at character 1)
  // 1.1
  // ^
  int c = int.parse('1.1');
  print(c);
}

因此,如果不确定要转的结果中是否包含小数,建议调用 num.parse() 进行转换。如果包含小数,则转换的结果是 double 类型;如果不包含小数,则转换的结果是 int类型。示例代码如下:

void main(List<String> args) {
  num a = num.parse('10');
  print(a); // 输出 10
  print(a is int); // 输出 true

  num b = num.parse('1.1');
  print(b); // 输出 1.1
  print(b is double); // 输出 true
}

5. 数字转字符串

如果希望把数字转为字符串,可以调用 toString() 函数,还可以调用 toStringAsFixed(n) 指定保留多少位小数。示例代码如下:

void main(List<String> args) {
  int a = 10;
  print(a.toString()); // 输出字符串 10
  // toStringAsFixed(n) 函数用来指定小数点后保留多少位小数,n 是数字
  print(a.toStringAsFixed(2)); // 转为字符串并保留两位小数,输出字符串 10.00

  double b = 1.1;
  print(b.toString()); // 输出 1.1
  print(b.toStringAsFixed(2)); // 转为字符串并保留两位小数,输出字符串 1.10

  num c = 4.567;
  num d = 1.234;
  // toStringAsFixed() 在保留小数时,会进行四舍五入
  print(c.toStringAsFixed(1)); // 转为字符串并保留一位小数,输出字符串 4.6
  print(d.toStringAsFixed(1)); // 转为字符串并保留一位小数,输出字符串 1.2
}

6. 其它常用函数

  1. abs() 求绝对值
  2. ceil() 上取整
  3. floor() 下取整
  4. round() 四舍五入
  5. toInt() 把数字转为 int 类型
  6. toDouble() 把数字转为 double 类型
void main(List<String> args) {
  // abs() 求绝对值
  int a = -10;
  print(a.abs()); // 输出 10

  // ceil() 上取整
  double b = 10.2;
  print(b.ceil()); // 输出 11

  // floor() 下取整
  double c = 10.99;
  print(c.floor()); // 输出 10

  // round() 四舍五入
  double d = 8.4;
  double e = 8.5;
  print(d.round()); // 输出 8
  print(e.round()); // 输出 9

  // toInt() 把数字转为 int 类型
  // 注意:直接去掉小数位,不会进行四舍五入
  double f = 3.14;
  double g = 7.98;
  print(f.toInt()); // 输出 3
  print(g.toInt()); // 输出 7

  // toDouble() 把数字转为 double 类型
  int h = 3;
  print(h.toDouble()); // 输出 3.0
}

版权归作者 ©刘龙宾 所有,本文章未经作者允许,禁止私自转载!

一个自由の前端程序员

2条评论

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注