首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将过分精确的分数舍入到对人类友好的精度

将过分精确的分数舍入到对人类友好的精度
EN

Stack Overflow用户
提问于 2014-05-22 06:41:03
回答 3查看 110关注 0票数 2

我怎样才能把一个过于精确的分数圈成一种不那么精确的格式,使之更具人情味呢?

我正在处理由MS的Windows成像组件提取的JPEG EXIF曝光时间数据。WIC以分数形式返回曝光时间,分子和分母的独立in。

WIC通常按预期工作,但对于某些JPEG,WIC以百万分之一秒为单位返回曝光时间,这意味着它报告的曝光时间为7391/1000000秒,而不是报告1/135秒的曝光时间。1/135和7391/1000000之间的差别很小,但对于大多数用户来说后者并不直观。因此,我想把过度精确的曝光时间调整到最近的标准曝光时间。

除了使用已知的合理曝光时间的查找表和找到最近的匹配之外,还有更好的方法来做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-22 06:59:54

你可以计算大分数的连续分数展开。然后把第一批浓缩剂中的一种作为你的近似分数。

在你的情况下,你得到

1000000/1000000= 0;135,3,2,.

第一个收敛值为1/135=0.0074074.

代码语言:javascript
运行
复制
1/(135+1/3) = 3/406 = 0.00738916256...

第三次

代码语言:javascript
运行
复制
1/(135+1/(3+1/2)) = 1/(135+2/7) = 7/947 = 0.00739176346...

要计算连续分数展开的(第一)系数,从xk=x0开始。然后迭代地应用该过程

  • 将xk=n+r分为整数n和小数部分r。
  • 整数是下一个系数ak,用分数部分的反式重新开始这个过程,xk = 1/r

应用于给定的数字,这正好产生上述序列的开始,然后重建有理表达式,继续,直到分母的平方的反比小于给定的公差。

票数 1
EN

Stack Overflow用户

发布于 2014-06-13 12:43:38

试试这个:

human_readable_denominator = int(0.5 +1/ precise_exposure_time)

你举的例子是:

human_readable_denominator = int(0.5 +1/ (7391/1000000)) = 135

对于小于1/2秒的曝光时间,这是很好的。对于较长的曝光时间,转换为1/X格式是没有意义的。

  • 菲尔
票数 1
EN

Stack Overflow用户

发布于 2014-06-13 12:50:59

看看Haskell's Data.Ratio中的Data.Ratio。你给它一个数字和一个epsilon值,它给出这个数的epsilon中最好的有理数。我猜想其他语言有类似的库函数,或者您可以翻译approxRational

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23799534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档