介绍

在WonderTrader的文件decimal.h中封装了一些用于浮点数(double)处理的工具函数,主要目的是解决浮点数精度误差带来的比较问题,以及进行一些常用运算(四舍五入、比较、取模等)。下面我们逐行详细解释每个函数的功能和实现逻辑。

🔹命名空间声明

namespace decimal { ... }

这将所有函数和常量包裹在 decimal 命名空间中,避免和其他代码冲突。

🔹EPSINON 常量定义

const double EPSINON = 1e-6;

用于浮点数比较的误差容忍值,表示在 1e-6 精度内认为两个浮点数相等。这是处理浮点误差的标准做法。

✅ 1. rnd:浮点数四舍五入

inline double rnd(double v, int exp = 1) 
{return round(v * exp) / exp;
}
作用:

将浮点数 v 按 exp 精度进行四舍五入。

举例:
输入输出
rnd(3.14159, 100)3.14
rnd(3.14159, 1000)3.142
rnd(123.456, 1)123

exp 决定精度:100 表示保留两位小数,1000 表示三位。

✅ 2. eq:判断是否相等(考虑精度误差)

inline bool eq(double a, double b = 0.0) noexcept
{return(fabs(a - b) < EPSINON);
}
作用:

判断 a 和 b 是否“近似相等”,误差在 1e-6 以内。

说明:

使用 fabs(a - b) 代替 a == b 是因为浮点数存在精度问题,直接比较会出错。

举例:
eq(0.3333333, 1.0/3) // true,虽然严格上不相等

✅ 3. gt:大于判断(排除误差)

inline bool gt(double a, double b = 0.0) noexcept
{return a - b > EPSINON;
}
作用:

判断 a > b,但要求 a - b 必须大于一个误差量 EPSINON,否则认为两者相等

✅ 4. lt:小于判断(排除误差)

inline bool lt(double a, double b = 0.0) noexcept
{return b - a > EPSINON;
}

等价于判断 a < b,但考虑了浮点误差。

✅ 5. ge:大于等于判断

inline bool ge(double a, double b = 0.0) noexcept
{return gt(a, b) || eq(a, b);
}

即:如果 a > b 或 a ≈ b,则 a >= b。

✅ 6. le:小于等于判断

inline bool le(double a, double b = 0.0) noexcept
{return lt(a, b) || eq(a, b);
}

即:如果 a < b 或 a ≈ b,则 a <= b。

✅ 7. mod:浮点数“取模”

inline double mod(double a, double b)
{return a / b - round(a / b);
}
功能:

返回 a / b 与最接近的整数的偏差部分(不是传统意义上的“取余”,而是衡量 a 与 b 的整数倍的偏差)。

举例:
mod(10.2, 5) = 10.2/5 - round(10.2/5) = 2.04 - 2 = 0.04
mod(14.9, 5) = 2.98 - 3 = -0.02
用途:

可用于判断一个值是否接近某个周期的整数倍。例如:

if (fabs(mod(t, period)) < 1e-6) {// t 是 period 的整数倍(考虑浮点误差)
}

或者用来检查委托价格是否是价格最小变动单位(价差)PriceTick 的整数倍,即判断这个价格是否“合法”。

// 检查价格是否非零(为 0 就没必要检查 tick 合法性了)
if(!decimal::eq(entrust->getPrice(), 0)) 
{// 获取该合约最小价格变动单位(例如 0.2、0.01、0.0001 等)double pricetick = commInfo->getPriceTick();// 看价格是 tick 的几倍,可能是小数double v = entrust->getPrice() / pricetick;// 判断价格是否是 pricetick 的整数倍(即合法价格)if (!decimal::eq(decimal::mod(entrust->getPrice(), pricetick), 0))	{bPass = false;msg = "委托价格不合法";break;}
}

总结:这些函数解决的问题

函数功能描述关键意义
rnd四舍五入到指定精度格式化数值
eq判断两个浮点数近似相等避免 a == b 失败
gt/lt判断严格大于/小于(排除误差)精确控制浮点比较
ge/le判断大于等于/小于等于浮点稳定性判断
mod判断是否接近某个倍数(周期性)用于时间或频率周期判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92322.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92322.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92322.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指针——练习

sizeof和strlensizeofsizeof是用来计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。sizeof只关注占用内存空间的大小&#xff0c;不在乎内存中存放什么数据。我们来看一下这个代码&a…

华为云 Flexus 部署 coze-studio

华为云 Flexus 部署 coze-studio 一、前置 主机和程序&#xff1a;云主机&#xff08;Flexus L ubuntu&#xff09; coze-studio 部署方式&#xff1a;docker&#xff08;提前装好的&#xff09; 字节跳动开源AI智能体开发平台Coze&#xff0c;具备极低的硬件门槛——2核CPU…

Linux系统编程Day7 -- 基于Linux系统知识的第一个程序

往期内容回顾 自动化构建工具-make/Makefile gcc/g编译及链接 Vim工具的使用 Linux常用工具&#xff08;yum与vim&#xff09; ​​​​​​ Linux系统编程Day4-- Shell与权限 编写第一个Linux程序 今天我们要利用我们所学到的Linux语言来编译第一个Linux程序&#xff0c;在进行…

安卓264和265编码器回调编码数据写入.265或者.264文件、查看编码数据是否正确、转换为Mp4文件、查看Mp4文件信息等方法合集

一、写入文件 1、变量定义 private FileOutputStream m265FileOutputStream null; private File m265File null; private static final String HEVC_265_FILE_NAME "output.265"; // 或 .265 private static final String AVC_264_FILE_NAME "output.264&qu…

如何打造一支AI时代下的IT团队,为企业战略目标快速赋能

执行摘要 在当前AI技术迅猛发展的背景下&#xff0c;中国中小企业正面临着前所未有的数字化转型机遇与挑战。据最新调研显示&#xff0c;2025年全球AI市场规模将突破5000亿美元&#xff0c;而中国AI应用占比已达35%。与此同时&#xff0c;AI领域人才缺口高达1000万人&#xff0…

机器学习-LinearRegression

1、 关键数学知识点&#xff1a; 边缘概率密度 联合密度对非关注变量积分&#xff1a;fX(x)∫fX,Y(x,y)dyf_X(x)∫f_{X,Y}(x,y)dyfX​(x)∫fX,Y​(x,y)dy&#xff1b; 条件概率密度 切片 fX∣Y(x∣y)fX,Y(x,y)/fY(y)f_{X|Y}(x|y)f_{X,Y}(x,y)/f_Y(y)fX∣Y​(x∣y)fX,Y​(x,y)…

解决微信小程序中如何把npm构建的模块与主包分离,构建到分包上面

1、配置分包2、复制packge.json到分包中3、在project.config.json中增加npm配置4、终端执行npm i下载模块5、构建npm到miniprogram_npm中

自动驾驶中的传感器技术21——Camera(12)

自动驾驶摄像头的图像评测 摄像头的性能受到环境光照、天气条件、运动模糊等因素的影响&#xff0c;因此需要通过多方面的评测来确保其在各种场景下的可靠性。 在自动驾驶领域&#xff0c;图像质量评估不仅关注图像的清晰度、分辨率等传统指标&#xff0c;还需要结合目标检测…

AI+OA原生应用 麦当秀AIPPT

麦当秀也在WAIC期间重新定义AIOA一、什么是“原生AI”&#xff1f;“原生AI”可以理解为&#xff1a;AI系统本身具备完整的办公能力&#xff0c;不需要依赖传统办公软件&#xff08;如Word、Excel、PPT&#xff09;作为载体。也就是说&#xff0c;用户可以直接通过AI系统完成文…

K8S 入门操作

之前一直用kubectl这个命令操作&#xff0c;这些都是基于命令来操作K8S kubectl get pods kubectl get nodes kubectl get svc kubectl create deployment... kubectl expose deployment...kubectl 文档 命令行工具 (kubectl) | Kubernetes 命令参考 Kubectl Reference Doc…

蒙文OCR识别技术难点实现及应用场景剖析

一、蒙文OCR识别核心技术难点1. 文字特性带来的识别挑战连写特性&#xff1a;蒙文字符存在复杂的连写形式&#xff08;词首、词中、词尾变形&#xff09;方向特异性&#xff1a;传统蒙文为垂直书写&#xff08;现代也有横排&#xff09;&#xff0c;需特殊方向处理字符相似性&a…

通过docker构建一个java镜像

通过docker构建一个java镜像 FROM zlyxzq/centos7:v1 VOLUME /tmp WORKDIR /app COPY /target/aa.jar /root/app/aa.jarENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV JAVA_HOME /usr/local/java ENV PA…

SpringBoot学习日记 Day5:解锁企业级开发核心技能

一、前言&#xff1a;从玩具项目到生产系统经过前四天的学习&#xff0c;我们已经能够开发基础功能了。但要让应用真正具备生产价值&#xff0c;还需要掌握数据库高级操作、事务控制、缓存优化等企业级开发技能。今天就来攻克这些关键知识点&#xff01;二、JPA进阶&#xff1a…

将英文PDF文件完整地翻译成中文的4类方式

文章目录一、在线翻译服务&#xff08;最快捷&#xff0c;适合临时查看&#xff09;1.1 代表工具&#xff1a;1.2 操作流程&#xff08;以Google翻译为例&#xff09;1.3 优点和缺点1.4 适用场景二、专业软件&#xff08;最佳平衡&#xff0c;兼顾格式与质量&#xff09;2.1 代…

【分享】我国八大沙漠空间矢量范围

今天小编整理分享的是 我国八大沙漠空间矢量范围shp。▲ 我国八大沙漠空间矢量范围概况数据概况我国八大沙漠空间矢量范围。中国八大沙漠。分别为腾格里沙漠&#xff0c;塔克拉马干沙漠&#xff0c;巴丹吉林沙漠&#xff0c;库布奇沙漠&#xff0c;乌兰布和沙漠&#xff0c;库…

【音视频】WebRTC C++ native 编译

一、搭建环境 我们这里介绍在Windows10VS2019的环境下编译WebRTC源码&#xff0c;由于WebRTC源码在外网上&#xff0c;需要科学的方式下载&#xff0c;不然下载特别慢&#xff0c;建议直接找国内下载好的源码&#xff0c;这里的源码是2021年的版本&#xff1a;https://pan.bai…

Selenium在Pyhton应用

目录 1. selenium的基本原理 2. selenium环境的搭建步骤 3. 元素的定位和操作 4.元素的基本属性方法 5.浏览器的操作方法 6.三种等待 强制等待 显示等待 隐式等待 7. 键盘与鼠标的操作 鼠标悬停用 拖拽操作 8. 下拉框元素定位 9.页面滚动操作 10. 页面截图操作 S…

【Docker】Redis基础命令在Docker中的使用

文章目录一 Redis 容器化部署指南1 获取 Redis 镜像2 服务启动2.1 首次启动新容器2.2 重启已有容器3 服务验证4 连接 Redis5 数据持久化方案5.1 使用 Docker 卷5.2 启用 AOF 持久化6 容器管理6.1 停止容器6.2 删除容器7 数据清理7.1 清空 Redis 数据7.2 完全移除7.3 删除数据卷…

ubuntu 2024 安装拼音输入法

1. 卸载ibussudo apt remove ibus2. install fcitx5核心组件sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-material-color3. 安装中文语言支持sudo apt install language-pack-zh-hans4. 设置默认输入法im-config -n fcitx55. 配置环境变量sudo vim ~/.bashrc粘贴&am…

语言模型的多个agent

是的&#xff0c;语言模型 在某些情况下确实可以通过多个 agent&#xff08;代理&#xff09;来共同协作完成任务。这种设计通常用于复杂任务或需要多步骤处理的场景&#xff0c;具体的流程如下&#xff1a; 1. 什么是 Agent&#xff1f; Agent&#xff08;代理&#xff09; 是…