别再回答面试官,toFixed采用的是四舍五入啦!

简介: 别再回答面试官,toFixed采用的是四舍五入啦!

前两天我写了篇《0.1 + 0.2 不等于 0.3?原来是因为这个》,大概就是说,0.1 + 0.2不等于0.3是因为浮点数精度问题。

结果在评论区看到一位热心网友的质疑:

我第一反应是,不会真讲错了吧?银行家舍位法又是什么?本着对大家负责任的态度,我还是严谨的好好查了下相关知识,并迅速提取到本质区别,然后回复了这位网友:

我都被我的严谨和效率感动到了。

今天我就来给大家讲讲,什么是所谓的“银行家舍入法”。

银行家舍入法,其实是一种戏谑的叫法,专业名词是奇进偶舍[1],一种数值修约规则。

数值修约,是指在进行具体的数字运算前,按照一定的规则确定一致的位数,然后舍去某些数字后面多余的尾数的过程。

比如我们最常用的四舍五入[2]就是其中一种数值修约规则,其它常见的还有上取整(ceil),下取整(floor)等等。

“奇进偶舍”的具体算法是什么样的呢?其实用一句话就可以概括:四舍六入五成双详细算法如下:

  • 保留位数的后一位如果小于5,则舍去。
  • 保留位数的后一位如果大于5,则进上去。
  • 保留位数的后一位如果是5
  • 且5后面仍有数,则无论奇偶都要进入。
  • 若5后面不再有数,要根据尾数“5”的前一位决定: 如果是奇数则进入,如果是偶数则舍去。

举个例子:(以保留两位小数为例)


5.214 ≈ 5.21(4小于5)
5.216 ≈ 为5.22(6大于5)
5.2254 ≈ 5.23(5后面有数,进入)
5.215 ≈ 5.22(5后面没数,前一位1是奇数,进入)
5.225 ≈ 5.22(5后面没数,前一位2是偶数,舍弃)

目前,大部分编程语言都是默认使用“奇进偶舍”,比如C/C++、JavaScript、PHP、Go等。

既然如此,我们用前端最擅长的JS试试效果(对应的函数是toFixed):

image.png

额……翻车了么?5.215不是说好了约等于5.22么,怎么在JS这里变5.21了?发生了什么?不用惊慌!其实这个问题我在上一篇《0.1 + 0.2 不等于 0.3?原来是因为这个》里就讲过了,就是浮点数精度问题导致的误差,我们可以来看看5.215到底是何方妖孽:image.png

看到了没?5.215底层竟然是5.214999……,那么此时按照奇进偶舍的规则,第三位4小于5直接舍弃,就成了5.21。

有意思吧?我之前讲的知识没白学吧哈哈(捏把汗,还好没误人子弟)。

好了,用法层面基本上讲完了。

不过大家是不是还有个疑问,为什么要采用这个修正规则呢?四舍五入这么简单粗暴的规则不香么?

因为从统计学的角度,“奇进偶舍”比“四舍五入”更为精确

来,我们一起看下:

假设有5位储户的利息分别是0.000、0.001、0.002、0.003、0.004,这些厘被四舍五入了,因此银行赚了。但另外5位储户的利息分别是0.005、0.006、0.007、0.008、0.009,那么他们每人拿到的利息就是0.01,银行亏了。

而根据本福特定律[3]的相关测算,首位非零数字的出现是有概率分布的,数字越低概率越大。但非首位的数,基本符合随机分布

那么上述10位储户的利息,经过四舍五入之后,银行的盈利情况如下:


0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005

银行亏了0.005!

这怎么能行!资本家的钱是你能轻易赚走的么而同样的数据,用“奇进偶舍”的规则计算后,刚好俩俩抵消,盈利为0,在这个案例几乎完美!不过,并不是所有的案例都如此完美,但本福特定律从统计学层面已经很好的解释和规避了大部分情况下的误差。当然不是零误差,只是让测量结果受到舍入误差的影响降到最低怎么样,今天你学废了么?


目录
相关文章
|
移动开发 前端开发 测试技术
关于前端AB实验,我是这么思考的
背景 大家好, 我是Fly哥, 这次分享的内容主要是关于ABtest ,我们是做用户增长的,说白了就是对应下面几个关键词。拉新、激活、留存,留存的话 又分为 次日留存、 3日留存,这些都是我们的指标, 但是产品设计一个需求的时候, 可能会有实验的性质,不确定哪一组实验,对于指标的反馈是正向的,或者是那一组实验的效果更加明显。 这时候产品就会去创建AB实验,然后拿线上的一部分流量,去做实验, 分析数据, 得出实验结论,然后看是否满足预期, 如果不满足 就暂停实验, 或者进行全量实验。 大家可以看下下面这张流程图: 图片 然后对于我们前端而言,我们关心的点只有两个 第一个就是接入ABtest,
关于前端AB实验,我是这么思考的
|
Kubernetes 容器
rancher 卸载及清理
rancher 卸载及清理
573 0
|
Web App开发 前端开发 .NET
基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
在之前的文章《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler》和《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件。
2386 0
|
3月前
|
人工智能 中间件 程序员
LLM 不断提升智能下限,MCP 不断提升创意上限
LLM 是大脑,MCP 是手脚。LLM 不断提升智能下限,MCP 不断提升创意上限。所有的应用和软件都会被 AI 改造,将向所有的应用和软件都会被 MCP 改造的新范式演进。
185 25
|
8月前
|
前端开发 JavaScript
使用 try-catch 语句来捕获 Promise 中的异常
【10月更文挑战第26天】使用try-catch语句捕获Promise中的异常是一种非常实用的技术,能够使异步代码的错误处理更加清晰、可控,提高程序的可靠性和稳定性。在实际开发中,合理地运用try-catch语句以及其他相关的错误处理机制,可以有效地应对各种可能出现的异常情况,为用户提供更好的体验。
|
3月前
|
人工智能 API Go
MCP Server 牛刀小试之雷池 MCP
MCP(Model Context Protocol)是AI编程领域的热门话题,由Anthropic于2024年提出。它是一种标准化协议,用于AI模型与本地/远程资源交互,类似USB-C接口,支持多种数据源和工具连接。本文以雷池WAF为例,介绍如何通过MCP协议创建服务器,实现AI自动化管理。项目使用Golang SDK开发,功能包括创建受保护应用、获取证书及攻击事件统计等。视频演示展示了如何查询近一个月的拦截事件和WAF证书配置。尽管开发工作量较大,但MCP使LLM与工具解耦,提升智能化水平。扩展资料包含中文文档和示例指南。
467 13
MCP Server 牛刀小试之雷池 MCP
|
4月前
|
人工智能 安全 数据库
MCP:跨越AI模型与现实的桥梁
本文主要围绕AI技术的进步,特别是Anthropic的Claude 3.7 Sonnet模型在逻辑推理、代码生成和复杂任务执行方面的能力提升及其应用场景。
MCP:跨越AI模型与现实的桥梁
|
11月前
|
SQL 存储 开发框架
Entity Framework Core 与 SQL Server 携手,高级查询技巧大揭秘!让你的数据操作更高效!
【8月更文挑战第31天】Entity Framework Core (EF Core) 是一个强大的对象关系映射(ORM)框架,尤其与 SQL Server 数据库结合使用时,提供了多种高级查询技巧,显著提升数据操作效率。它支持 LINQ 查询,使代码简洁易读;延迟加载与预先加载机制优化了相关实体的加载策略;通过 `FromSqlRaw` 或 `FromSqlInterpolated` 方法支持原始 SQL 查询;可调用存储过程执行复杂任务;利用 `Skip` 和 `Take` 实现分页查询,便于处理大量数据。这些特性共同提升了开发者的生产力和应用程序的性能。
484 0
|
11月前
|
设计模式 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
|
11月前
|
SQL 开发框架 .NET
深入解析Entity Framework Core中的自定义SQL查询与Raw SQL技巧:从基础到高级应用的全面指南,附带示例代码与最佳实践建议
【8月更文挑战第31天】本文详细介绍了如何在 Entity Framework Core (EF Core) 中使用自定义 SQL 查询与 Raw SQL。首先,通过创建基于 EF Core 的项目并配置数据库上下文,定义领域模型。然后,使用 `FromSqlRaw` 和 `FromSqlInterpolated` 方法执行自定义 SQL 查询。此外,还展示了如何使用 Raw SQL 进行数据更新和删除操作。最后,通过结合 LINQ 和 Raw SQL 构建动态 SQL 语句,处理复杂查询场景。本文提供了具体代码示例,帮助读者理解和应用这些技术,提升数据访问层的效率和灵活性。
565 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问