强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Julia 教程 / 基本类型与数值计算

基本类型与数值计算

1. 类型体系概览

Julia 的类型系统是动态类型(运行时检查)与强类型(不允许隐式类型转换)的结合。所有类型形成一棵以 Any 为根的树。

Any
├── Number
│   ├── Real
│   │   ├── AbstractFloat
│   │   │   ├── Float16
│   │   │   ├── Float32
│   │   │   ├── Float64
│   │   │   └── BigFloat
│   │   ├── Integer
│   │   │   ├── Bool
│   │   │   ├── Signed
│   │   │   │   ├── Int8, Int16, Int32, Int64, Int128
│   │   │   │   └── BigInt
│   │   │   └── Unsigned
│   │   │       └── UInt8, UInt16, UInt32, UInt64, UInt128
│   │   └── Rational
│   │       └── Rational{T}
│   └── Complex
│       └── Complex{T}
├── AbstractString
│   └── String
├── Char
├── Bool (also under Integer)
└── ...(函数、容器、自定义类型等)

2. 整数类型

有符号整数

类型位数最小值最大值
Int88-128127
Int1616-3276832767
Int3232-21474836482147483647
Int6464-9.2×10¹⁸9.2×10¹⁸
Int128128-1.7×10³⁸1.7×10³⁸

无符号整数

类型位数最大值
UInt88255
UInt161665535
UInt32324294967295
UInt64641.8×10¹⁹
UInt1281283.4×10³⁸

机器默认类型

julia> typeof(42)
Int64           # 64 位系统默认 Int64

julia> Sys.WORD_SIZE
64

julia> typeof(42.0)
Float64         # 默认浮点类型

💡 提示: 在大多数场景下,直接使用 Int64Float64 即可,无需显式指定类型。Julia 的 JIT 编译器会自动选择最优的机器指令。


3. 浮点类型

类型位数精度(十进制位)说明
Float1616~3.3半精度,GPU 计算常用
Float3232~7.2单精度,深度学习常用
Float6464~15.9双精度,科学计算默认
BigFloat任意可配置任意精度浮点数
# 浮点字面量
x = 3.14           # Float64
y = 3.14f0         # Float32
z = Float16(3.14)  # Float16

# 科学计数法
c = 3.0e8          # 3.0 × 10⁸
avogadro = 6.022e23

# 特殊浮点值
Inf        # 正无穷
-Inf       # 负无穷
NaN        # 非数字
Inf32      # Float32 正无穷

浮点精度陷阱

julia> 0.1 + 0.2
0.30000000000000004

julia> 0.1 + 0.2 == 0.3
false

# 正确的比较方式
julia> isapprox(0.1 + 0.2, 0.3)
true

julia> abs(0.1 + 0.2 - 0.3) < 1e-15
true

⚠️ 注意: 浮点数比较永远不要用 ==,使用 isapprox() 或设置容差比较。这是所有编程语言的通用陷阱。


4. 布尔类型与字符类型

Bool

julia> true
true

julia> typeof(true)
Bool

julia> Bool(1)
true

julia> Bool(0)
false

julia> Bool(42)    # 非零为 true
true

# 布尔运算
julia> true && false    # 逻辑与
false

julia> true || false    # 逻辑或
true

julia> !true            # 逻辑非
false

# 布尔可参与算术
julia> true + true + false
2

Char

julia> c = 'A'
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)

julia> typeof(c)
Char

julia> Int(c)
65

julia> Char(65)
'A'

# Unicode 字符
julia> '中'
'中': Unicode U+4E2D (category Lo: Letter, other)

julia> Int('中')
20013

julia> '\u03b1'    # α
'α': Unicode U+03B1 (category Ll: Letter, lowercase)

# 字符操作
julia> 'a' < 'b'
true

julia> isletter('x')
true

julia> isdigit('7')
true

julia> uppercase('a')
'A'

5. 字符串(简介)

字符串在下一章详细讲解,此处介绍基本用法:

# 字符串字面量用双引号
s = "Hello, Julia!"

# 字符串是不可变的 UTF-8 序列
julia> sizeof(s)
14

julia> length(s)    # 字符数(不是字节数)
14

# 字符串插值
julia> name = "Julia"
julia> "Hello, $name!"
"Hello, Julia!"

# 字符串拼接
julia> "Hello" * ", " * "Julia!"
"Hello, Julia!"

6. BigInt 与 BigFloat 任意精度

当标准类型精度不够时,使用任意精度类型:

# BigInt — 任意精度整数
julia> big(2)^100
1267650600228229401496703205376

julia> factorial(big(100))    # 100!
93326215443944152681699238856266700490715968264381621468592963895217599993229915\
608941463976156518286253697920827223758251185210916864000000000000000000000000

# BigFloat — 任意精度浮点数
julia> big(π)
3.141592653589793238462643383279502884197169399375105820974944592307816406286198

# 设置精度(二进制位数)
julia> setprecision(256) do
           big(1) / big(3)
       end
3.333333333333333333333333333333333333333333333333333333333333333333333333333319e-01

# 高精度圆周率
julia> setprecision(1000) do
           BigFloat(π)
       end
3.141592653589793238462643383279502884197169399375105820974944592307816406286208\
99862803482534211706798214808651328230664709384460955058223172535940812848111745028410270...

精度对比表

计算Float64BigFloat (256 位)
1/30.33333333333333330.333333333333333333…3319
π3.1415926535897933.14159265358979323…
√21.41421356237309511.41421356237309504…

💡 提示: BigIntBigFloat 运算比原生类型慢 100-1000 倍,仅在确实需要高精度时使用。


7. 算术运算与数学函数

基本算术

julia> 2 + 3      # 加法
5

julia> 10 - 4     # 减法
6

julia> 3 * 7      # 乘法
21

julia> 15 / 4     # 除法(总是返回浮点数)
3.75

julia> 15 ÷ 4     # 整除(\div + Tab)
3

julia> 15 % 4     # 取余
3

julia> 15 mod 4   # 取模
3

julia> 2^10       # 幂运算
1024

julia> 2         # 平方根(\sqrt + Tab)
1.4142135623730951

julia> 2.0^0.5
1.4142135623730951

数学函数

# 三角函数(弧度制)
sin(π/2)       # 1.0
cos(0)         # 1.0
tan(π/4)       # 1.0
asin(1)        # π/2
atan(1)        # π/4

# 对数与指数
log(ℯ)         # 1.0(自然对数)
log2(8)        # 3.0
log10(1000)    # 3.0
exp(1)         # ℯ
exp2(10)       # 1024.0

# 取整函数
round(3.7)        # 4.0
floor(3.7)        # 3.0
ceil(3.2)         # 4.0
trunc(3.7)        # 3.0(截断小数部分)

# 绝对值与符号
abs(-5)           # 5
abs2(-3)          # 9(平方)
sign(-7)          # -1
sign(0)           # 0

# 最大最小值
max(3, 7)         # 7
min(3, 7)         # 3
clamp(15, 0, 10)  # 10(钳位到范围)

# 统计
sum(1:100)        # 5050
prod(1:5)         # 120

8. 溢出行为

Julia 的固定精度整数溢出时会环绕(wrap around),不会报错:

julia> typemax(Int64)
9223372036854775807

julia> typemax(Int64) + 1
-9223372036854775808    # 溢出为最小值!

julia> typemin(Int64)
-9223372036854775808

julia> UInt8(255) + UInt8(1)
0x00                    # 无符号溢出到 0

防溢出策略

# 方案 1:使用 BigInt(不溢出)
julia> big(typemax(Int64)) + 1
9223372036854775808

# 方案 2:使用 checked 算术(溢出时抛异常)
julia> using Base.Checked
julia> checked_add(typemax(Int64), 1)
# 抛出 OverflowError

# 方案 3:使用 saturating 算术(溢出时钳位)
julia> using Base.Checked
julia> Base.Checked.add_with_overflow(typemax(Int64), 1)

⚠️ 注意: Julia 整数溢出不报错是刻意的设计决策(与 C 一致),以保证性能。在涉及金融计算等场景时,务必使用 BigIntchecked_* 系列函数。


9. 类型转换

convert — 类型转换

# 基本转换
julia> convert(Float64, 42)
42.0

julia> convert(Int64, 3.14)    # 截断小数
3

julia> convert(Int64, 3.9)     # 也是截断
3

julia> convert(Bool, 0)
false

julia> convert(Bool, 42)
true

# 失败的转换
julia> convert(Int64, 3.5)
# 方法错误:不能直接转换

parse — 字符串解析

julia> parse(Int64, "42")
42

julia> parse(Float64, "3.14")
3.14

julia> parse(Bool, "true")
true

julia> parse(Int64, "hello")
# 抛出 ArgumentError

# 带进制解析
julia> parse(Int, "ff", base=16)
255

julia> parse(Int, "1010", base=2)
10

强制类型转换 T(x)

julia> Float32(42)
42.0f0

julia> Int8(100)
100

julia> Int8(200)    # 溢出!
-56

julia> UInt8(255)
0xff

10. 有理数类型

Julia 内置精确有理数支持:

julia> 1//3
1//3

julia> typeof(1//3)
Rational{Int64}

julia> 2//4      # 自动约分
1//2

julia> 1//3 + 1//6
1//2

julia> 1//3 * 3
1//1

julia> float(1//3)    # 转为浮点数
0.3333333333333333

# 分子与分母
julia> numerator(3//7)
3

julia> denominator(3//7)
7

💡 提示: Rational 类型可以精确表示分数,避免浮点舍入误差。在需要精确比较分数大小时非常有用。


11. 单位量(Unitful.jl)简介

通过 Unitful.jl 可以给数值附加物理单位,实现类型安全的量纲计算:

using Pkg; Pkg.add("Unitful")
using Unitful

# 带单位的数值
julia> 1u"m" + 2u"cm"
1.02 m

julia> 1u"km" / 1u"hr"
1.0 km hr⁻¹

# 单位转换
julia> uconvert(u"mph", 100u"km/hr")
62.13711922373339 mph

# 温度
julia> uconvert(u"°F", 100u"°C")
212.0 °F

# 编译时检查量纲一致性
julia> 1u"m" + 1u"s"
# 错误:不能将长度和时间相加

12. 数值计算业务场景

金融复利计算

function compound_interest(principal, rate, years, n=12)
    """计算复利终值
    principal: 本金
    rate: 年利率(如 0.05 表示 5%)
    years: 年数
    n: 每年复利次数(默认月复利)
    """
    return principal * (1 + rate / n)^(n * years)
end

# 10 万元年利率 5%,10 年
compound_interest(100_000, 0.05, 10)
# 164700.95

# 连续复利
continous_compound(principal, rate, t) = principal * exp(rate * t)

物理计算

# 抛物线运动
function projectile(v0, θ, t; g=9.81)
    vx = v0 * cos(θ)
    vy = v0 * sin(θ)
    x = vx * t
    y = vy * t - 0.5 * g * t^2
    return (x=x, y=y)
end

# 以 30 m/s、45° 发射
pos = projectile(30, π/4, 2.0)
println("x = $(pos.x) m, y = $(pos.y) m")

扩展阅读


📌 本章小结: Julia 提供完整的数值类型层次,从 8 位整数到任意精度浮点数。默认 Int64 / Float64 满足大多数场景。整数溢出会环绕(非报错),使用 BigIntchecked_* 避免。Rational 提供精确分数运算,Unitful.jl 提供类型安全的物理量纲计算。