is_zero_approx
最后同步日期:2026-04-15 | Godot 官方原文 — is_zero_approx
is_zero_approx
定义
is_zero_approx 是一个用来判断一个浮点数是否"近似等于零"的函数。
它其实就等价于 is_equal_approx(x, 0.0),但因为零是一个特殊的参照点,Godot 专门提供了这个更简洁的写法,而且内部实现也更高效。
打个比方:就像你问"这个数是不是小到可以忽略不计?"——比如你的角色速度是 0.000001,虽然不是严格的 0,但在游戏里完全可以当作静止来处理。
什么时候需要用到它?
- 判断物体的速度是否已经减速到"基本为零"
- 检测某个数值是否已经衰减到可以忽略
- 在物理模拟中判断力的大小是否可以忽略
函数签名
// 静态方法,通过 Mathf 类调用
public static bool IsZeroApprox(float x)# 全局函数,无需前缀直接调用
func is_zero_approx(x: float) -> bool参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
x | float | 要判断是否近似为零的浮点数 |
返回值
bool — 如果 x 的绝对值小于 0.00001(即 abs(x) < 0.00001),返回 true;否则返回 false。
与 is_equal_approx 不同,is_zero_approx 使用的是固定的绝对阈值,因为参照点是零,不存在"相对误差"的概念。
代码示例
基本用法:判断浮点数是否近似为零
using Godot;
public partial class MyNode : Node
{
public override void _Ready()
{
float a = 0.000001f;
float b = 0.0f;
float c = 0.1f;
GD.Print(Mathf.IsZeroApprox(a)); // 输出: True (非常接近零)
GD.Print(Mathf.IsZeroApprox(b)); // 输出: True (就是零)
GD.Print(Mathf.IsZeroApprox(c)); // 输出: False (离零太远了)
}
}extends Node
func _ready():
var a = 0.000001
var b = 0.0
var c = 0.1
print(is_zero_approx(a)) # 输出: True (非常接近零)
print(is_zero_approx(b)) # 输出: True (就是零)
print(is_zero_approx(c)) # 输出: False (离零太远了)实际场景:判断角色是否已经停止移动
using Godot;
public partial class Player : CharacterBody3D
{
// 导出属性:摩擦力衰减系数
[Export] public float ExFriction = 5.0f;
// 内部变量:当前水平速度
private Vector3 _velocity = Vector3.Zero;
public override void _PhysicsProcess(double delta)
{
// 施加摩擦力,让速度逐渐衰减
_velocity = _velocity.MoveToward(Vector3.Zero, ExFriction * (float)delta);
// 用 is_zero_approx 判断速度是否已经基本为零
// 注意:需要对每个分量分别判断
if (Mathf.IsZeroApprox(_velocity.X)
&& Mathf.IsZeroApprox(_velocity.Y)
&& Mathf.IsZeroApprox(_velocity.Z))
{
GD.Print("角色已停止移动");
}
Velocity = _velocity;
MoveAndSlide();
}
}extends CharacterBody3D
# 导出属性:摩擦力衰减系数
@export var friction: float = 5.0
# 内部变量:当前水平速度
var _velocity: Vector3 = Vector3.ZERO
func _physics_process(delta):
# 施加摩擦力,让速度逐渐衰减
_velocity = _velocity.move_toward(Vector3.ZERO, friction * delta)
# 用 is_zero_approx 判断速度是否已经基本为零
# 注意:需要对每个分量分别判断
if is_zero_approx(_velocity.x) \
and is_zero_approx(_velocity.y) \
and is_zero_approx(_velocity.z):
print("角色已停止移动")
velocity = _velocity
move_and_slide()注意事项
等价于
is_equal_approx(x, 0.0):is_zero_approx(x)和is_equal_approx(x, 0.0)的效果一样,但is_zero_approx更简洁、更高效,推荐优先使用。判断阈值是固定的:
is_zero_approx使用固定的绝对阈值0.00001。如果你的需求需要更大或更小的阈值,请直接用abs(x) < your_threshold自定义。Vector2 和 Vector3 的判断:如果需要判断一个向量是否近似为零向量,可以用
vec.IsEqualApprox(Vector2.Zero)或vec.IsEqualApprox(Vector3.Zero),而不需要逐个分量调用is_zero_approx。负数也能通过判断:
is_zero_approx(-0.000001)同样返回true,因为它只看绝对值。
