(摘自Lua程序设计)

数值常量

从Lua5.3版本开始Lua语言为数值格式提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点类型(注意,"float"代表双精度),对于资源受限的平台,可以使用Lua精简模式,32位整形和单精度浮点型。

具有十进制小数或者指数的数值会被当作浮点类型,否则会被当作整形值。

整形和浮点型值的类型都是"number"

type(3) --> number
type(3.5) --> number
type(3.0) --> number

由于整型值和浮点型值的类型都是"number", 所以它们是可以相互转换的。同时,具有相同算术值得整型值和浮点类型的值在Lua语言中是相等的:

1 == 1.0 --> true
-3 == -3.0 -->true
0.2e3 == 200 -> true

在少数情况下,当需要区分整型值和浮点型值时,可以使用函数math.type:

math.type(3) --> integer
math.type(3.0) --> float

我们通常可以通过增加0.0的方法将整型强制转换为浮点型

算术运算

除了加减乘除,取负数登常见的运算符外,Lua语言还支持取整除法(floor除法),取模和指数运算。

对于Lua5.3中引入的整型而言,主要的建议就是:开发人员要么选择忽略整型和浮点型的不同,要么就完整的控制每一个数值的表示。

两个整型进行相加相减相乘和取负的结果仍然是整型值。

如果两个操作数都是整型值,那么结果也是整型值;否则就是浮点型值。

当操作数一个是整型,一个是浮点型时,Lua语言会在进行算术运算之前先把整型转为浮点型。

由于两个整数的相除结果不一定是整数,因此除法运算操作的结果永远是浮点型值。

Lua5.3针对整数除法引入了一个称为floor除法的新运算符//。顾命思意floor除法会对得到的商向负无穷取整,从而保证结果是一个整数。这样floor除法和其他的算术运算符遵循一样的规则:如果操作数都为整型,结果就为整型,否则就是浮点型值。

3 // 2 --> 1
3.0 // 2 --> 1.0

取模运算的定义:

a % b == a - ((a // b) * b)

取模运算也遵从算术运算的规律,如果两个数位整型那么结果就为整型,否则为浮点型。

其结果符号永远与第二个操作数符号保持一致,对于任意的正常量K,即使x是负数,x%K的结果也永远在[0, K - 1]之间。

对于实数类型的操作数而言,取模运算有一些不同。

x = math.pi
--保留两位小数
x - x % 0.01 --> 3.14
--保留三位小数
x - x%0.001 --> 3.141

Lua语言同时支持幂运算,使用符号^表示。

关系运算

<  >  <=  >= == ~= 这些关系运算的结果都是Boolean类型。

==用于相等性测试,~=用于不等性测试。这两个运算符可以应用于任意两个值,当这两个值得类型不同时,Lua会认为他们是不相等得。否则,会根据它们的类型再进行比较。

比较数值时应永远忽略数值的子类型,数值究竟以整型还是浮点类型表示并无区别,只与算数值有关。(尽管如此,比较具有相同子类型的数值时效率更高)

数学库:

Lua包括三角函数(sin, cos, tan, asin等),指数函数,取整函数,最大和最小函数max和min,用于生成伪随机数的函数(random)以及常量pi和huge(最大可表示数值,相当于多数平台的inf)

所有的三角函数都是以弧度为单位,并通过函数deg和rad进行角度和弧度的转换。

math.random用于生成伪随机数,共有三种调用方式。

1.当不带参数调用时,该函数将返回一个在[0,1)范围内均匀分布的伪随机整数。

2.当使用带有一个带整型值n的参数时,该函数将返回一个在[1,n]范围内的伪随机整数。

3.当使用带有两个整型值l和r的参数调用时,该函数返回在[l, r]范围内的伪随机整数。

函数randomseed用于设置伪随机数发生器的种子,该函数唯一参数就是数值类型的种子。当一个程序启动时,系统会固定使用1作为种子初始化伪随机数发生器。如果不设置其他的种子,那么每次程序运行时都会生成相同的伪随机数序列。

通常调用math.randomseed(os.time())来使用当前系统时间作为种子初始化随机数发生器。

取整函数:

数学库提供了三个取整函数: floor, ceil, modf。

其中floor向负无穷取整,ceil向正无穷取整,modf向零取整。当取整结果能够用整型表示时,返回结果为整型值,否则返回浮点型值。除了返回取整后的值以外,函数modf还会返回小数部分作为第二个结果。

math.floor(3.3) -->3
math.ceil(3.3) -->4
math.modf(303) --> 3 0.3

如果参数本身就是一个整数值,那么它将原样返回。

如果想将数值向最近的整数取整,可以对x + 0.5调用floor函数。

当参数是一个很大的数时,简单的加法可能会出错。

列如当x = 2^52 + 1时

2^52 + 1.5的浮点值是不精确的。

我们可以单独的处理整数值:

function round(x)
local f = math.floor(x)
if x == f then return f
else return math.floor(x + 0.5)
end
end

标准Lua使用64个比特位来存储整型值,其最大值为2的63次方 - 1,约等于10的19次方;精简Lua使用32个比特位存储整型值,其最大值约为20亿。数学库中的常量定义了整型值得最大值和最小值(math.maxinteger和math.mininteger)

当我们在整型操作时出现比mininteger更小或者比maxinteger更大的数值是,结果就会回环。

math.maxinteger + 1 == math.mininteger --> true
math.mininteger - 1 == math.maxinteger --> true

运算符优先级

(从上到下,最上为最大)

^

一元运算符(-  #(求长度)  ~  not)

*  /  //  %

+  -

..(字符串连接)

<<  >>

&

~(按位异或)

|

<  >  <=  >=  ~=  ==

and

or

Lua程序设计之数值的更多相关文章

  1. Lua程序设计之字符串精要

    (摘自Lua程序设计) 基本: Lua语言的字符串是一串字节组成的序列. 在Lua语言中,字符使用8个比特位来存储. Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串 ...

  2. Lua程序设计入门

    在Lua中,一切都是变量,除了关键字.TTMD强大了. 1.注释 -- 表示注释一行 --[[ ]]表示注释一段代码,相当于C语言的/*....*/ 注意:[[ ... ]]表示一段字符串 2.lua ...

  3. lua程序设计(一)

    摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...

  4. Lua 程序设计 (Roberto,Ierusalimschy 著)

    1 开始 2 类型与值 3 表达式 4 语句 5 函数 6 深入函数 7 迭代器与泛型for 8 编译,执行与错误 9 协同程序(coroutine) 10 完整的示例 11 数据结构 12 数据文件 ...

  5. lua程序设计 第一章习题答案

    练习1.1:运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题. 答:当输入负数时,循环无法终止,因为原本程序中的终止条件为n==0,而在输入为负数情况下,无法达成此终止条 ...

  6. 《Lua程序设计 第二版》学习笔记一

    Lua简介 Lua是一种简单.可拓展.可移植及高效的脚本语言. 开始 Lua之间不需要分隔符 运行方式: Linux下: lua -i prog dofile("lib1.lua" ...

  7. lua元表和元方法 《lua程序设计》 13章 读书笔记

    lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...

  8. 关于Lua程序设计{读书笔记}

    1.lua中的标识符可以是由任意字母.数字和下划线构成的字符串,但不能以数字开头.2.lua将通常类似"_VALUE"的标识符作为保留标识符3.lua的保留字 and break ...

  9. JavaScript高级程序设计之数值数组排序

    如果数组中全是Nunber类型,则可以按照数值大小排序 , , , , ]; // asc升序函数 function compareAsc(value1, value2) { if (value1 & ...

随机推荐

  1. JAVA数据结构之红-黑树

    本篇博客我会重点介绍对红-黑树的理解,重点介绍红-黑树的查找,这里我们将要讨论的算法称为自顶向下插入,也就是把沿着树向下查找插入点 Ⅰ.平衡树和非平衡树 平衡树和非平衡树:当插入一组数据关键字是按照升 ...

  2. thinkphp 使用php代码

    Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式: 直线电机选购 第一种:使用php标签 例如: <php>echo 'Hello, ...

  3. Vue+Iview+Node 项目结构和配置

    1.项目调整后的目录 api:数据接口定义 assets:静态文件 components:组件  config:项目相关配置  driective:指令   router:路由   store:状态管 ...

  4. golang中使用gorm连接mysql操作

    一.代码 package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/go- ...

  5. 互联网金融ABS为何遭遇急刹车?

    互联网金融ABS为何遭遇急刹车?   今年以来,互联网金融ABS迎来爆发式增长,已逐渐成为平台融资的重要渠道.近期有媒体称,监管方面已叫停审批,原因何在? 本期看点: 互联网金融ABS与传统ABS有何 ...

  6. 19.SimLogin_case05

    # 使用自造的cookies登录马蜂窝 import requests from lxml import etree str = 'mfw_uuid=5bcfcc20-b235-fbbe-c1d6-a ...

  7. winform程序捕获全局异常,对错误信息写入日志并弹窗

    使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...

  8. python基础语法(运算符及优先级)

    python基础语法(运算符及优先级) python语言支持的运算符类型 算数运算符 假设变量a为10,变量b为21 算数符 描述 实例 + 加-两个对象相加 a+b结果31 - 减-得到一个负数或者 ...

  9. 机器学习-线性回归算法(单变量)Linear Regression with One Variable

    1 线性回归算法 http://www.cnblogs.com/wangxin37/p/8297988.html 回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,回归= ...

  10. iOS开发系列-JSON解析

    概述 JOSN是一种轻量级的数据格式,一般用于数据交互.服务器返回给客户端,一般都是JSON格式或者XML格式. JSON的格式: {"name" : "CoderHon ...