spintf格式化double类型怎样保证小数精度准确?

milanleon 2018-01-18 10:36:45
比如以下格式化得到的buf实际上是"12.109999999999999"而不是希望的"12.11":
	double d = 12.11;
char buf[100] = { 0 };
sprintf_s(buf, "%.15f", d);

而如果去掉小数位数,使用%f的话小数位数只能保留6位,如下的buf是"12.123457"
	double d = 12.123456789;
char buf[100] = { 0 };
sprintf_s(buf, "%f", d);
...全文
462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2018-01-20
  • 打赏
  • 举报
回复
你自己应该知道自己需要多少位精度,在满足需要的情况下尽可能少输出 比如你举的第一个例子,实际上输出小数点后14位应该就不错了 普通应用很少有需要这么多小数位的精度要求
bocneuy 2018-01-18
  • 打赏
  • 举报
回复
sprintf_s(buf, "%.2f", d);
自信男孩 2018-01-18
  • 打赏
  • 举报
回复
double类型的数据应该用%lf输出。 精度本身就是有有效值的。
赵4老师 2018-01-18
  • 打赏
  • 举报
回复
paschen 2018-01-18
  • 打赏
  • 举报
回复
1、很多十进制浮点数在二进制本身就没法精确表示,要精确表示可用BCD等方式存储,所以浮点数本身就是会存在精度误差的 2、如果不加%.n控件符的话默认就只有那么多位,你可以通过%.n设置你希望的值
milanleon 2018-01-18
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
%.15g
赵4老师 2018-01-18
  • 打赏
  • 举报
回复
%.15g
内容概要:本文档是关于“基于小信号扫频辨识的光伏并网逆变器正负序交互稳定性分析”的博士论文复现资源,配套提供Matlab代码与Simulink仿真实现。内容聚焦于弱电网条件下光伏并网逆变器的稳定性问题,深入研究其正负序阻抗建模方法、小信号扫频辨识技术及正负序交互失稳机理。通过构建高精度的系统仿真模型,采用扫频法提取逆变器在不同控制环路(如锁相环、电流环)影响下的序阻抗特性,并结合奈奎斯特稳定性判据评估其与电网阻抗之间的交互作用,系统性地揭示了宽频带振荡的产生机制。该资源完整还原了论文中的关键理论推导与仿真验证流程,适用于从事新能源并网、电力电子系统建模与稳定性分析的研究人员进行学习、复现与二次开发。; 适合人群:具备电力系统、电力电子与自动控制理论基础,熟练掌握Matlab/Simulink仿真工具,从事新能源发电并网、逆变器控制策略或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 复现并验证博士论文中提出的光伏逆变器正负序阻抗建模与小信号扫频分析方法;② 深入理解弱电网环境下由正负序耦合引发的交互失稳现象及其物理机理;③ 掌握基于阻抗法的并网系统稳定性分析流程,为虚拟同步机、构网型控制等先进控制策略的稳定性研究提供技术参考与仿真支撑。; 阅读建议:建议学习者结合提供的代码与仿真模型,首先深入理解序阻抗建模与扫频辨识的基本原理,然后逐步调试仿真程序,重点关注锁相环动态、电流控制器参数对序阻抗曲线的影响,最终掌握从模型搭建、扫频测试到稳定性判据应用的全流程分析能力。

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧