无法精确的浮点数
老师给出的TestDouble.java,经过运行测试,发现两个浮点数相加得数竟然竟然不对0.05 + 0.01 = 0.060000000000000005,1.0 - 0.42 = 0.5800000000000001,4.015 * 100 = 401.49999999999994,不是不对,而是不精确.
这是时候想起自己大一写的代码,浮点数判等.一直都是做差绝对值在一个很小的范围就认为是相等.
int is_equal(double a, double b) {
return fabs(a - b) < EPSILON;
}
只知道要这么写,却不知道为什么.今天要彻底弄懂.
原来并不是浮点数运算不精确,而是从储存开始,浮点数就已经不"纯洁"了------浮点数无法被精确的存入计算机.这与计算机的储存方式有关,我们输入十进制的浮点数,存入计算机的时候会转化成二进制,而小数部分常常无法被二进制准确表示,就导致后续的计算也无法精确.
所以计算机是无法精确存入浮点数的.
查询的资料:
浮点数表示:计算机中的浮点数通常遵循IEEE 754标准,它将浮点数分为三部分:符号位、指数部分和尾数(或有效数字)。这种表示方法虽然可以表示很大的范围,但有限的比特位数意味着无法精确存储所有的实数。
有限精度:浮点数使用有限的位数来存储数值,实际能表示的数值的精度受到位数的限制。这意味着许多实数(尤其是十进制小数)不能以二进制的形式精确表示。例如,十进制数0.1在二进制中是一个无限重复的小数,无法精确存储。
舍入误差:由于浮点数只能存储有限位数,当计算结果超出其精度范围时,计算机将不得不进行舍入,从而引入了误差。这种误差在进行一系列数学运算时可能会积累,导致最终结果与理论值之间存在差异。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库