你一直在关注数值,所以或早或晚,必定会对值进行一些数学运算。如果回想在学校的时间,关于三角函数和微积分等,可能会记得使用科学计算器计算来解决困难的数学问题,比如涉及正弦余弦等可怕的数学函数。在Haxe里,所有这些数学函数都被存储在 Math 类中。
幸运的是,本书不是一本数学教科书,所以本章会排除一些数学理论,但是向你展示一些常见的Math类的方法,所以至少了解一些基础。下表是Math类中的一些方法:
|Math 字段|描述|
| -- | -- |
|NEGATIVE_INFINITY: Float|负无穷大,代表一个负的被0除|
|NaN:Float|代表非数字|
|PI:Float|PI的值|
|POSITIVE_INFINITY: Float|正无穷大,代表一个正数的被0除|
|abs(value:Float):Float|绝对值|
|acos(value:Float):Float|返回一个弧度表示的角的反余弦|
|asin(value:Float):Float|返回一个弧度表示的角的反正弦|
|atan(value:Float):Float|返回一个弧度表示的角的反正切|
|atan2(value1:Float, value2:Float):Float|Returns the angle of the point x / y in radians|
|ceil(value:Float):Int|向下取整|
|cos(value : Float) : Float |返回一个弧度表示的角的余弦|
|exp(value : Float) : Float |Returns the base of the natural logarithm to the power of the supplied float |
|floor(value:Float):Int|向上取整|
|isFinite(value:Float):Bool|如果等于正负无穷大则返回true,否则返回 false|
|isNaN(value:Float):Bool|如果不是一个数字返回true,否则false|
|log(value:Float):Float|寻找一个数值的对数|
|max(value1 : Float, value2 : Float) : Float|返回两者之中的最大的值|
|min(value1:Float,value2:Float):Float|返回两者之中的最小值|
|pow(value:Float,value2:Float):Float|返回value1的value2次方|
|random():Float|返回0到1之间的一个随机数|
|round(value:Float):Int|四舍五入取整|
|sin(value:Float):Float|返回一个弧度表示的角的正弦|
|sqrt(value:Float):Float|返回平方根|
|tan(value:Float):Float|返回一个弧度表示的角的正切|
# 除以0的难题
* * * * *
当在Haxe中使用数值,可能会触及一些障碍,即使最有经验的开发者难以避免。大概多数这些骚扰来自于除以0的问题。问题是,无论什么样的计算机处理数据,任何数除以0都会产生一个非常大的数据,即使Haxe里的Float类型可以处理再大的数字,也没有办法包含一个无限的值。为了解决这个问题,Haxe的Math类提供两个常数,允许你测试这个错误:NEGATIVE_INFINITY 和 POSITIVE_INFINITY。 这两个常数值都是Float类型,但是不表示实际的值。只是让你比较自己的Float值来知道是否他们是有效的数字:
~~~
var myFlt : Float = 2 / 0;
var isValid : Bool = (myFlt != Math.POSITIVE_INFINITY);
~~~
也可以使用Math类的方法 isFinite,如果数值不是一个有限的值,则返回true:
~~~
var myFlt : Float = 2 / 0;
var isValid : Bool = Math.isFinite(myFlt);
~~~
# NaN
* * * * *
另外一个测试数字有效性的方法是使用NaN常量。NaN,也就是说 Not A Number ,用来检查是否一个 Float或者Int是有效的数值类型。如果一个数值类型无效,那么它的值就是NaN。
~~~
var myFlt : Float;
untyped { myFlt = “Not a Number”; }
var isValid : Bool = (myFlt != Math.NaN);
~~~
在Neko,这样一个表达式是有效的,isValid变量会测试true,在Flash,结果就不是一个有效的数字,结果将是false 。Haxe的Math类也提供一个方法叫做isNaN 。这个方法会在数值无效的时候返回true,可以以下方式使用:
~~~
var myFlt : Float;
untyped { myFlt = “Not a Number”; }
var isValid : Bool = !Math.isNaN(myFlt);
~~~
如你所见,否定操作符用来返回true,如果结果是一个有效的数值类型。
# Float和Int的转换函数
* * * * *
当转换一个浮点数为整数,虚拟机只会简单的无视小数点后的数字。这相当于向下浮动到最接近的整数。Haxe的Math类提供一些其他的控制方法来转换Float到Int。包括 floor,ceil和round:
floor 方法执行和投射一个Float到Int相同的功能,向下取整。ceil方法,执行向上取整。而round方法,会根据四舍五入的原则取整。
- 本书目录
- 第一章:Haxe介绍
- 互联网开发的一个问题
- Haxe是什么,为什么产生
- Haxe编译工具
- Haxe语言
- Haxe如何工作
- 那么Neko是什么
- Haxe和Neko的必须条件
- 本章摘要
- 第二章:安装、使用Haxe和Neko
- 安装Haxe
- 使用Haxe安装程序
- 在Windows上手动安装Haxe
- Linux上手动安装Haxe
- 安装Neko
- Windows上手动安装Neko
- 在Linux上安装Neko
- Hello world! 一式三份
- 编译你的第一个Haxe应用
- 你的程序如何编译
- HXML编译文件
- 编译到Neko
- 编译为JavaScript
- 程序结构
- 编译工具开关
- 本章摘要
- 第三章:基础知识学习
- Haxe层级结构
- 标准数据类型
- 变量
- 类型推断
- 常数变量
- 简单的值类型
- 浮点类型
- 整型
- 选择数值类型
- 布尔类型
- 字符串类型
- 抽象类型
- Void 和 Null
- 动态类型
- unknown类型
- 使用untyped绕过静态类型
- 注释代码
- 转换数据类型
- Haxe数组
- Array
- List
- Map
- Haxe中使用日期时间
- 创建一个时间对象
- Date组件
- DateTools类
- 操作数据
- 操作符
- Math类
- 使用String函数
- 本章摘要
- 第四章:信息流控制
- 数据存放之外
- 条件语句
- if语句
- switch语句
- 从条件语句返回值
- 循环
- while循环
- for循环
- 循环集合
- Break和Continue
- 函数
- 类的函数
- 局部函数
- Lambda类
- 本章摘要
- 第五章:深入面向对象编程
- 类和对象
- 实例字段
- 静态字段
- 理解继承
- Super
- 函数重载
- 构造器重载
- toString()
- 抽象类和抽象方法
- 静态字段,实例变量和继承
- 继承规则
- 使用接口
- 高级类和对象特性
- 类的实现
- 类型参数
- 匿名对象
- 实现动态
- Typedef
- 扩展
- 枚举
- 构造器参数
- 本章摘要
- 第六章:组织你的代码
- 编写可重用代码
- 使用包
- 声明一个包
- 隐式导入
- 显式导入
- 枚举和包
- 类型查找顺序
- 导入一个完整的包
- 导入库
- Haxe标准库
- Haxelib库
- 其他项目中的库
- 外部库
- 使用资源
- 文档化代码
- 离线文档
- 在线文档
- 单元测试
- haxe.unit包
- 编写测试
- 本章摘要
- 第七章:错误调试
- trace函数
- trace输出
- haxe的trace和ActionScript的trace
- 异常
- 异常处理
- CallStack和ExceptionStack
- 异常管理类
- 创建完全的异常处理类
- 异常类代码
- 本章摘要
- 第八章:跨平台工具
- XML
- XML剖析
- Haxe XML API
- 正则表达式
- EReg类
- 模式
- 定时器
- 延迟动作
- 队列动作
- MD5
- 本章摘要
- 第九章:使用Haxe构建网站
- Web开发介绍
- Web 服务器
- 使用Web服务器发布内容
- HTML速成课程
- Haxe和HTML的区别
- NekoTools Web Server
- Apache安装mod_neko
- Windows安装Apache和mod_neko
- Linux安装Apache和Mod_Neko
- 第一个Haxe网站
- 使用Neko作为网页Controller
- neko.Web类
- Neko作为前端控制器
- 本章摘要
- 第十章:使用模板进行分离式设计
- 什么是模板
- Template类
- Template语法
- 使用资产
- 何时在模板中使用代码
- 服务器端模板的Templo
- 安装Templo
- 使用Templo
- haxe.Template和mtwin.Templo表达式上的区别
- Attr表达式
- Raw表达式
- 逻辑表达式
- 循环表达式
- set, fill, 和 use表达式
- Templo中使用宏
- 手动编译模版
- 第十一章:执行服务端技巧
- 第十二章:使用Flash构建交互内容
- 第十三章:使用IDE
- 第十四章:通过JavaScript制作更多交互内容
- 第十五章:通过Haxe远程通信连接所学
- 第十六章:Haxe高级话题
- 第十七章:Neko开发桌面应用
- 第十八章:用SWHX开发桌面Flash
- 第十九章:多媒体和Neko
- 第二十章:使用C/C++扩展Haxe
- 附加部分