文档章节

[译] 隐藏的精度(HiddenPrecision)

暗夜在火星
 暗夜在火星
发布于 2017/03/29 19:59
字数 711
阅读 56
收藏 0
/**
 * 献给我最尊敬的偶像Martin Fowler
 * 原文出处:https://martinfowler.com/bliki/HiddenPrecision.html
 * @author dogstar.huang <chanzonghuang@gmail.com> 2017-03-22
 */

本翻译已征得Martin Fowler同意,并链接在博客原文下方。

有时当我在处理某些数据时,这些数据比我想象中的更精确。有人可能会觉得这应该是件好事,毕竟精确度是有益的,所以越精细越好。但隐藏的精度可能会导致一些微妙的缺陷。

const validityStart = new Date("2016-10-01");   // JavaScript  
const validityEnd = new Date("2016-11-08");  
const isWithinValidity = aDate => (aDate >= validityStart && aDate <= validityEnd);  
const applicationTime = new Date("2016-11-08 08:00");

assert.notOk(isWithinValidity(applicationTime));  // 并不是我想要的  

我打算通过指定开始日期和结束日期来创建一个闭区间的日期范围,这就是上面代码所做的事。然而,实际上我并指定的不是日期,而是指定了某个时刻,即我没有把结束日期标识为11月8号,而是标识为11月8号的凌晨00点00分。因此,11月8日那天的任何时间(除了午夜之外)都超出了原本打算包含它在内的日期范围。

对于日期,隐藏的精度是一个公共的问题,因为有一个实际上提供了类似这样时刻的日期创建功能是很可悲的。这是糟糕命名的一个例子,确实也是普遍糟糕日期和时间建模的一个例子。

日期是隐藏精度问题一个不错的例子,但另一个罪魁祸首则是浮点数。

const tenCharges = [  
  0.10, 0.10, 0.10, 0.10, 0.10,
  0.10, 0.10, 0.10, 0.10, 0.10,
];
const discountThreshold = 1.00;  
const totalCharge = tenCharges.reduce((acc, each) => acc += each);  
assert.ok(totalCharge < discountThreshold);   // 并不是我想要的  

当我运行这些代码时,有一条日记显示totalCharge0.9999999999999999。这是因为很多变量无法用浮点数精确表示,导致了少量看不见的精度在尴尬的时候却显而易见。

这里其中的一个结论是,使用浮点数来表示金额要非常非常谨慎(如果你有一个带有类似分这样分数部分的货币,那么通常最好用整数来表示分数,如用500表示€5.00,带上金额类型则更好)。更一般的结论是,浮点在比较时是巧妙的(这就是为什么测试框架的断言针对比较总是会有一个精确度)。

致谢

Arun Murali,James Birnie,Ken McCormack,和Matteo Vaccari在我们内部的邮件列表讨论了这篇文章的草稿。


------------------------

© 著作权归作者所有

暗夜在火星

暗夜在火星

粉丝 169
博文 177
码字总数 326789
作品 1
广州
程序员
私信 提问
【译】你不知道的 Chrome 调试工具技巧 第十八天:Drawer 里的秘密

特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。据作者透露一共有 24 篇,一直更新到 12 月 24 日 版权归原作者所有。 作者在Twitter上推荐我们的中文翻译啦,截图在最后...

dendoink
2018/12/20
0
0
【译】你不知道的 Chrome 调试工具技巧 第十四天:其他快捷键~

特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。据作者透露一共有 24 篇,一直更新到 12 月 24 日 版权归原作者所有。 作者在 Twitter 上推荐我们的中文翻译啦,截图在最...

dendoink
2018/12/18
0
0
【译】你不知道的 Chrome 调试工具技巧 第二十二天:network

特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。据作者透露一共有 24 篇,一直更新到 12 月 24 日 版权归原作者所有。 作者在 Twitter 上推荐我们的中文翻译啦,截图在最...

dendoink
2018/12/29
0
0
简单入门——深度学习笔记(Part I)

首发地址:https://yq.aliyun.com/articles/71667 更多深度文章,请关注:https://yq.aliyun.com/cloud 作者介绍:Deepak Shah Deepak Shah毕业于德克萨斯奥斯汀分校,徒步旅行爱好者,目前是...

uncle_ll
2017/07/12
0
0
【译】你不知道的Chrome调试工具技巧 第六天:command 菜单

特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。据作者透露一共有24篇,一直更新到12月24日 版权归原作者所有。 前两篇的翻译链接我已经给到了作者本人,虽然他不理解中...

dendoink
2018/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-allegro环境变量和快捷键

Allegro作为一款高速PCB设计的EDA软件,有完善的约束规则设计和信号完整性电源完整性仿真等各种专业工具深受电子行业从业者喜爱。 对于该软件来说,电子从业者接触最多的就是Allegro的画板功...

demyar
11分钟前
1
0
腾讯云存储

1、进入腾讯云平台,创建 2、进入配置查看域名 3、查看KEY参数 4、将2、3中的参数录入到cms后台 然后点测试按钮查看情况

迅睿CMS-PHP开源CMS程序
12分钟前
1
0
ES 6.x 版本 待验证的CURL命令查询操作

1. 查询数据 curl -H "Content-Type: application/json" -XGET http://elastic:123456@127.0.0.1:9200/alias1/_search -d '{"query": {"match_all": {}}}' 2. 添加数据 如果有不指定ID可以自......

coord
20分钟前
1
0
如何写好论文摘要:研究人员不得不知的小秘诀

我们为何要写摘要? 它的目的为何? 简而言之,摘要的目的就是简单的讨论这篇文章让读者更容易的了解这篇文。 它能在读者与作者之间搭起一条桥梁。当您搜索信息时,您无法一下阅读整篇文章,...

论文辅导员
22分钟前
1
0
移动端、PC端(前后台)、小程序常用的UI框架

移动端、PC端(前后台)、小程序常用的UI框架 1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youzan/vant 优点:用来做移...

jason_kiss
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部