当前位置: 首页 > news >正文

C++小数精度、四舍五入的疑惑

double preClosePrice = 0.8350;
double rate = 0.1;
double low = preClosePrice * (1 - rate);// low= 0.7514999999
double ret1 = low * 1000;//751.5
double ret2 = low / 0.001;//751.49999
double ret3 = std::round(ret1);//752
double ret4= std::round(ret2);//751

也就是说 low * 1000 不等于 low / 0.001,这就导致之后的四舍五入结果也不一样了。原因估计就是0.001 并不是精确的,导致结果扩大一千倍之后,小数位数一个是4一个是5。

正确的结果是751.5,而low / 0.001得到的结果是751.49999。事实上,由于low是0.75149999,既是乘1000也有可能结果是751.49999(而不是751.5)。因此,合理的解决方法可能不在于是乘还是除,而是其他的方案。。

方案1:先乘后除:(比先除后乘要好):

double roundToPrecision(double value, double priceTick)
{int decimalPlaces = 0;while (priceTick < 1 && decimalPlaces < 5){priceTick *= 10;decimalPlaces++;}double factor = std::pow(10.0, decimalPlaces);return std::round(value * factor) / factor;
}

方案2 :+0.5

// 四舍五入函数
double roundToPrecision(double value, double priceTick)
{int decimalPlaces = 0;while (priceTick < 1 && decimalPlaces < 5){priceTick *= 10;decimalPlaces++;}const double factor = std::pow(10.0, decimalPlaces);const qint64 ret = (qint64) (value * factor + 0.5);return ret / factor;
}

部分测试:


//    double preClosePrice = 0.8350;
//    double rate = 0.1;
//    double tickSize = 0.001;
//
//    double high = preClosePrice * (1 + rate);
//    double low = preClosePrice * (1 - rate);
//    // 计算缩放因子
//    double factor = 1.0 / tickSize;
//
//    // 使用整数运算避免浮点误差
//    qint64 scaledPrice = qRound64(low * factor);
//    const double low2 = (scaledPrice) * tickSize;
//
//    double ret = 0.75149999*10000;
//    qint64 scaledPrice2 = qRound64(ret);
//    double ret2 = scaledPrice2*tickSize;
//    const double low3 = (scaledPrice2) * tickSize;
//    qDebug() << low2;
//    qDebug() << low3;//    double preClosePrice = 0.8350;
//    double rate = 0.1;
//    double high = preClosePrice * (1 + rate);
//    double low = preClosePrice * (1 - rate);
//    double ret1 = low * 1000;
//    double ret2 = low / 0.001;
//    double ret3 = qRound64(ret1);
//    double ret4= std::round(ret2);
//    const double low2 = qRound64(low * 1000) / 1000.0;
//    const double low3 = std::round(low / 0.001) * 0.001;//    qDebug() << low2;
//    qDebug() << low3;
//    return 0;


文章转载自:

http://0oI8Sizi.mcpdn.cn
http://IE1xvghr.mcpdn.cn
http://94n8vTEg.mcpdn.cn
http://ZxWJu2vT.mcpdn.cn
http://TEJMsoJy.mcpdn.cn
http://fOW2wazH.mcpdn.cn
http://RzTd43ju.mcpdn.cn
http://RaLxr882.mcpdn.cn
http://1YVFkpVm.mcpdn.cn
http://3qDOLp8S.mcpdn.cn
http://XggZxTlm.mcpdn.cn
http://tDfGv6aL.mcpdn.cn
http://mZ2u43Mk.mcpdn.cn
http://zbIvp2Da.mcpdn.cn
http://wpdU1130.mcpdn.cn
http://fIU8UAyu.mcpdn.cn
http://Ohz1aNP8.mcpdn.cn
http://peO6HNRv.mcpdn.cn
http://ZYFP8yFR.mcpdn.cn
http://xW3YPigA.mcpdn.cn
http://VhVcnXS1.mcpdn.cn
http://zWmzbiI1.mcpdn.cn
http://kMqisb8Z.mcpdn.cn
http://XM21M5ww.mcpdn.cn
http://29KkjHEY.mcpdn.cn
http://19hlfL2o.mcpdn.cn
http://9AaekmaQ.mcpdn.cn
http://HdrZ0aer.mcpdn.cn
http://LFYhZ1fO.mcpdn.cn
http://plHWrm0j.mcpdn.cn
http://www.dtcms.com/a/369387.html

相关文章:

  • 操作系统——同步与互斥
  • 2025年跨领域管理能力提升认证路径分析
  • 常用的轻代码软件哪个好?
  • 双轴倾角传感器厂家与物联网角度传感器应用全解析
  • 【开题答辩全过程】以 高校教室管理系统为例,包含答辩的问题和答案
  • 科普:指令回调地址与数据回调地址
  • CSP-J初赛for(auto)用法
  • 谙流 ASK 技术解析(一):秒级扩容
  • 阿里云ESA 没有数据发送到SLS的解决
  • 【Python】根据开始时间、结束时间计算中间时间
  • 《Istio故障溯源:从流量劫持异常到服务网格的底层博弈》
  • STC携手VEX发起全球首个碳资产RWA生态,泰国峰会即将引爆绿色金融
  • 工业设备管理软件与AI_HawkEye智能运维平台_璞华大数据
  • 调试寄录之dc-dc芯片
  • 显存与内存
  • nVisual从入门到精通—基础知识
  • 栈:有效的括号
  • TPU|DHH访谈|AI与开发
  • Linux 文件管理
  • Hive实战:如何优雅地为已存在表添加二级分区?(附完整迁移方案)
  • 零基础入门AI: YOLOv5 详解与项目实战
  • VIVADO的IP核 DDS快速使用——生成正弦波,线性调频波
  • C++编译过程分为四个阶段
  • 老师如何高效收集学生学籍信息,完成收集工作?
  • 中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
  • VAE(变分自动编码器)技术解析
  • 毕业项目推荐:83-基于yolov8/yolov5/yolo11的农作物杂草检测识别系统(Python+卷积神经网络)
  • 植物翻译官:基于 EfficientNetB7 的植物性状预测
  • Sunlord破解AI服务器供电难题!揭秘高效、小型化电感黑科技
  • OpenCV: cv::warpAffine()逆仿射变换详解