C#中这个整数乘以浮点数,为什么多出了个尾巴?

davexa 2021-07-07 10:54:09

Hi,

C#中代码片段如下:

int nStdWorkDays;
double dbStdWorkDaysMin;


            nStdWorkDays = 21;


            dbStdWorkDaysMin = nStdWorkDays * 0.9;
            //此时监视变量dbStdWorkDaysMin 的值,发现竟然是18.900000000000002,而非18.9!
            //结果造成 "18.9 < dbStdWorkDaysMin" 为true,逻辑走偏!

 

 这个简单的乘法,结果为什么多了个尾巴00000000000002?类似的坑还有哪些?该如何注意避免?谢谢!

...全文
693 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

误差精度,是计算机原理。估计没有学原理课程。

比较这类大小要使用类似 double.Epsilon以及其它 XX.Epslion 之类的常量为阈值。

真相重于对错 2021-07-08
  • 打赏
  • 举报
回复

计算机里绝大多数情况下无法准确表示一个浮点数
计算机是内部是二进制的,而人们所说的浮点数是10进制,必然涉及一个转换问题
10进制的0.1意思是1个东西,分为十份,取1份
而二进制数的0.1表示1个东西分两份,取1份,二进制的0.1是10进制的0.5。他们之间转换必有误差。

低丶调 2021-07-07
  • 打赏
  • 举报
回复

确实,这种精度问题好麻烦,看了一圈msdn,也是看的有点懵逼,以后都不敢用这些浮点了.... -_-

davexa 2021-07-07
  • 举报
回复
@低丶调 哈哈。乘法好像更容易丢失精度。
xuzuning 2021-07-07
  • 打赏
  • 举报
回复 1

浮点数不能直接比较大小,应该检查他们的差是否在允许的范围内

狂彪的蜗牛 2021-07-07
  • 打赏
  • 举报
回复 1

你还是使用decimal来进行运算吧,浮点数的四舍五入也是有问题的,在一定范围内,decimal还是精确的

davexa 2021-07-07
  • 打赏
  • 举报
回复

根据业务情境,加了一行代码如下,实现纠偏。
dbStdWorkDaysMin = Math.Round(dbStdWorkDaysMin, 1);

石岩Maple 2021-07-07
  • 打赏
  • 举报
回复 1

不可能

飞天凤凰601 2021-07-07
  • 举报
回复 2
@石岩Maple 没有什么不可能,我就碰上了,最后用的decimal
davexa 2021-07-07
  • 举报
回复
@石岩Maple 真实发生的哦。不信的话,将那几行代码编译运行一下看看。
xuzuning 2021-07-07
  • 打赏
  • 举报
回复 1

请先补习一下 浮点数 的知识

狂彪的蜗牛 2021-07-07
  • 打赏
  • 举报
回复 1

将需要运算的两个变量定义为decimal,再进行运算

内容概要:本文围绕城市场景下无人机三维路径规划的导航变量多目标优化问题,提出了一种改进的多目标粒子群优化算法(NMOPSO),旨在应对高维、多约束条件下路径规划的复杂性。研究在Matlab平台上实现了算法仿真,通过构建精细化的城市三维环境模型,综合考虑路径长度、飞行安全性、能耗等多个优化目标,有效提升了无人机在复杂城市环境执行任务时的路径规划效率与可靠性。文系统阐述了NMOPSO算法的设计原理、实现流程及关键参数配置,并通过大量对比实验验证了该算法在收敛速度、解集多样性和Pareto前沿质量方面相较于传统多目标优化算法的显著优势; 适合人群:具备一定优化算法理论基础和Matlab编程能力的研究生、科研人员及从事无人机路径规划、智能优化算法研发的工程技术人员; 使用场景及目标:①应用于城市环境下的无人机物流配送、电力巡检、应急救援等实际任务的高效路径规划;②为高维多目标优化问题的研究与先进智能算法的改进提供高质量的参考案例,推动智能优化技术在无人系统自主决策领域的深入应用; 阅读建议:建议读者结合提供的Matlab代码进行动手实践,重点研读目标函数的数学建模、环境约束的处理机制以及算法性能评价指标的设计,以深入理解NMOPSO算法的核心创新点与工程实现细节。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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