数字教程

lua-users home
wiki

内部表示

一些语言默认支持以下一种或多种数字类型

5.3 版本添加了整数支持(数字可以是整数),但以下大部分信息并没有失效,因为在需要时会进行类型转换。

为了简单起见,Lua 只支持一种数字类型:浮点数。默认情况下,这些是双精度浮点数。但是,如果您需要,Lua 可以轻松地重新编译以支持单精度浮点数。如果您不熟悉浮点数,那么阅读有关 浮点数 的信息可能对您有益。

要记住的最重要的一点是,如果您使用带小数部分的数字(或除法),它们可能会有舍入误差。

此外,在十进制中具有无限循环模式的数字在二进制中将不会具有这些模式,因此不要假设任何小数都是“安全的”。要记住的最重要的一点是,不要对小数使用 == 运算符,因为它检查的是完全相等。要记住的另一点是,编写代码时要确保舍入误差不会随着时间的推移而累积到很大的量。

如果您的数字是整数(没有小数部分),并且它们没有达到 2^63;那么您就不必担心这些问题。

使用数字

我们可以通过在表达式前加上 = 来使用 Lua 交互式命令行提示符作为计算器,例如:

Lua 5.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
> = 1
1
> = 1 + 2
3
> = 3.1415927
3.1415927
> = 5 / 6
0.83333333333333
我们可以输入数字并计算简单的计算。Lua 也理解用于以 <value>e<exponent><value>E<exponent> 形式表示数字的指数类型,它表示 <value> * 10 ^ <exponent>
> = 1.2345e6
1234500
> = 543.21E8
54321000000
> = 2.56e-4
0.000256
我们可以将数字分配给变量并进行算术运算
> width = 7.5
> height = 12.7
> = width * height
95.25
> depth = 2.8
> area = width * height
> volume = area * depth
> print(area, volume)
95.25   266.7

数学库

Lua 配备了一个数学库(参见参考手册的第 5.6 节 [1])。提供的函数如下

math.abs     math.acos    math.asin       math.atan    math.atan2
math.ceil    math.cos     math.cosh       math.deg     math.exp
math.floor   math.fmod    math.frexp      math.ldexp   math.log
math.log10   math.max     math.min        math.modf    math.pow
math.rad     math.random  math.randomseed math.sin     math.sinh
math.sqrt    math.tan     math.tanh
我们将尝试几个函数和变量作为示例。
> = math.sqrt(101)
10.049875621121
> = math.pi
3.1415926535898
> = math.sin( math.pi/3 )
0.86602540378444
阅读 数学库教程 以了解更多详细信息。

转换

您可以使用 tonumber() 函数将字符串转换为数字。它接受一个字符串参数并返回一个数字。

> = tonumber("123") + 25
148
> x = tonumber("123.456e5")
> print(x)
12345600

对于将整数转换为浮点数,此计算将返回转换后的整数的十进制格式

> = (16 ^ 13) + 10 - (16 ^ 13)
10.0

强制转换

Lua 将自动将字符串和数字类型转换为正确的格式以执行计算。例如:如果您尝试对字符串应用算术运算,Lua 将首先尝试将该字符串转换为数字。否则,操作将无法执行。如果字符串无法转换为数字,则会引发错误。这种类型的自动转换称为强制转换

> = 100 + "7"
107
> = "1000" + 234
1234
> = "hello" + 234
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: ?
> = 234 + "1000"
1234
您可以看到,当字符串被转换为数字时,计算成功。字符串"hello"无法转换为数字,因此会发生错误。在静态类型语言(例如 C)中,这会导致错误,因为您无法将值分配给类型不兼容的变量,除非进行强制转换。这在 Lua 中有效,因为它是一种动态类型语言。

一个值得注意的例外:比较运算符(== ~= < > <= >=不会强制转换其参数。 (不)相等运算符认为数字不等于其字符串表示(实际上,也不等于任何非数字类型)。当您向有序比较运算符提供不同类型时,它们会抛出错误。

> = 100 == "100"
false
> = 100 ~= "hello"
true
> = 100 ~= {}
true
> = 100 == tonumber("100")
true
> = 100 <= "100"
stdin:1: attempt to compare number with string
stack traceback:
        stdin:1: in main chunk
        [C]: ?
出于性能原因,您应该尽量避免过度依赖自动强制转换。确保性能敏感计算(尤其是在内部循环中)中的所有数字都具有正确的类型。
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2023 年 10 月 18 日凌晨 1:49 GMT (差异)