如何将有理数格式化为小数?

2024-01-10

给定一个任意大(或小)Rational具有有限十进制表示形式的数字,例如:

r = Rational(1, 2**15)
#=> (1/32768)

如何以字符串形式获取其完整的十进制值?

上述数字的预期输出是:

"0.000030517578125"

to_f显然不起作用:

r.to_f
#=> 3.0517578125e-05

And sprintf要求我指定位数:

sprintf('%.30f', r)
#=> "0.000030517578125000000000000000"

Most ten-year-olds know how to do that: use long division!1

Code

def finite_long_division(n,d)
  return nil if d.zero?
  sign = n*d >= 0 ? '' : '-'
  n, d = n.abs, d.abs
  pwr =
  case n <=> d
  when 1 then power(n,d)
  when 0 then 0
  else        -power(d,n)-1
  end            
  n *= 10**(-pwr) if pwr < 0
  d *= 10**(pwr)  if pwr >= 0
  s = ld(n,d)
  t = s.size == 1 ? '0' : s[1..-1]
  "%s%s.%s x 10^%d" % [sign, s[0], t, pwr]
end

def power(n, d)
  # n > d
  ns = n.to_s
  ds = d.to_s
  pwr = ns.size - ds.size - 1
  pwr += 1 if ns[0, ds.size].to_i >= ds.to_i
  pwr
end

def ld(n,d)
  s = ''
  loop do # .with_object('') do |s|
    m,n = n.divmod(d)
    s << m.to_s
    return s if n.zero?
    n *= 10
  end
end

Examples2

finite_long_division(1, 2**15)
  #=> "3.0517578125 x 10^-5"
finite_long_division(-1, 2**15)
  #=> "-3.0517578125 x 10^-5"
finite_long_division(-1, -2**15)
  #=> "3.0517578125 x 10^-5"

finite_long_division(143, 16777216)
  #=> "8.523464202880859375 x 10^-6"
143/16777216.0
  #=> 8.52346420288086e-06 

finite_long_division(8671,
  803469022129495137770981046170581301261101496891396417650688)
  #=> "1.079195309486679194852923588206549145803161531099624\
  #      804222395643336829571798416196370119711226461255452\
  #      67714596064934085006825625896453857421875 x 10^-56"      

Recall that every rational number has either a decimal representation or contains an infinitely-repeating sequence of digits (e.g., 1/3 #=> 0.33333..., 3227/555 #=> 5.8144144144... and 1/9967 #=> 0.00010033109260559848...3). This method would therefore never terminate if the rational was of the repeating sequence variety. Since one generally doesn't know in advance which type a rational number is, it might be useful to modify the method to first determine if the rational number has a finite decimal representation. It is known that a rational number n/d which cannot be reduced (by removing common factors) has this property if and only if d is divisible by 2 or by 5 and is not divisible by any other prime number.4 We could easily construct a method to determine if an already-reduced rational number has that property.

require 'prime'

def decimal_representation?(n, d)
  primes = Prime.prime_division(d).map(&:first)
  (primes & [2,5]).any? && (primes - [2, 5]).empty?
end

1 At least that was true when I was a kid.

2 See here http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/fractions.html#section3.1.1 for a partial list of rational numbers that have finite decimal representations.

3 This rational number's repeating sequence contains 9,966 digits.

4 Reference http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/fractions.html#section3.1.1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将有理数格式化为小数? 的相关文章

随机推荐

  • 如何将一个数字分成n组

    我需要将一个数字分成几组数字 然后将这些数字放入一个数组中 然后我将对这些数字进行一些简单的数学运算 然后将它们插入到文本框中 到目前为止 我只找到了如何将数字拆分为单独的数字 如下所示 var number 12354987 output
  • python Fabric是否支持动态设置env.hosts?

    我想动态更改 env hosts 因为有时我想先部署到一台机器 检查是否正常 然后部署到多台机器 目前我需要先设置 env hosts 如何在方法中设置 env hosts 而不是在脚本启动时全局设置 是的 你可以设置env hosts动态
  • MySQL > 表不存在。但它确实(或者应该)

    我更改了 MySQL 安装的数据目录 除了一个之外 所有库都正确移动 我可以连接并且USE数据库 SHOW TABLES还正确返回所有表 并且每个表的文件都存在于 MySQL 数据目录中 然而 当我尝试SELECT表中的某些内容 我收到一条
  • 内存分配问题

    这个问题是在面试的笔试中被问到的 include
  • 使用 FileProvider 从图库中选取图像文件

    编译 Android N 我遇到了一个问题FileProvider 我需要让用户从图库中选择图像 用相机拍照 然后将其裁剪为正方形 我已经成功实现了FileProvider用于用相机拍摄图像 但我在从图库中选取图像时遇到严重问题 问题是 在
  • 线段树、区间树、二叉索引树和范围树有什么区别?

    线段树 区间树 二叉索引树和范围树之间有什么区别 关键思想 定义 应用领域 更高维度的性能 秩序 空间消耗 请不要仅仅给出定义 所有这些数据结构都用于解决不同的问题 线段树存储间隔 并针对 这些区间中的哪一个包含给定点 查询 区间树也存储间
  • 配置 Rails 以输出 HTML 输出而不是 XHTML

    使用助手 表单 javascript css 等 时 如何配置 Ruby on Rails 输出标准 HTML 代码而不是 XHTML I don t想要在末尾有斜线
  • 如何压缩两个不同大小的列表,重复较短的列表?

    我想压缩两个不同长度的列表 例如 A 1 2 3 4 5 6 7 8 9 B A B C 我期待这个 1 A 2 B 3 C 4 A 5 B 6 C 7 A 8 B 9 C 但内置的zip不会重复与较大尺寸的列表配对 是否存在任何内置方法可
  • 如何动态更改引导模式数据目标点击

    我有一个网站日历 其作用类似于预订请求 我在 Bootstrap 2x 中可以使用此功能 但已将应用程序转换为 3 0 一切似乎都正常 但我试图找出如何动态更改数据目标 如果日期可用 日历中的一天可能如下所示 div class NotRe
  • 我应该使用 YUI 压缩机还是新的 Google Closure 编译器来压缩 JavaScript?

    YUI Compressor 是公认的最佳最小化工具 但 Closure 似乎还可以更好 无论你找到最适合你的那个 我认为这是目前的普遍答案 YUI 已经推出了更长的时间 因此毫无疑问将是目前公认的最佳工具 然而 Closure 对我们来说
  • 如何让 gvim 与 Visual Studio 2010 完美配合?

    在我的上一份工作中 他们使用 Visual Studio 2005 有时也使用 Visual Studio 97 为了方便使用命令行 我使用 vim 来编辑 Mercurial 版本控制配置文件 如 hgrc 和 hgignore 然而 我
  • 更改 HTML POST 端口

    我在 HTML 文档中有一个表单 我想将其内容作为 POST 请求提交到服务器 但是 我想将 POST 请求发送到服务器上除端口 80 之外的端口 这可能吗 只需将其附加到操作中即可
  • 5xx 或 4xx 错误,“不存在‘Access-Control-Allow-Origin’标头”

    我的浏览器在 devtools 控制台中记录以下消息 请求的资源上不存在 Access Control Allow Origin 标头 响应的 HTTP 状态代码为 503 背景 我有两个应用程序 一种是连接到 Mongo 数据库的 Exp
  • Android模拟低数据信号强度

    我在使用某个应用程序时遇到了一些问题 我们的用户抱怨在信号强度较低的情况下 他们在使用该应用程序时遇到了问题 有什么办法可以在模拟器上模拟这个吗 Thanks Teja 我知道在 DDMS 的 模拟器控制 选项卡中 顶部有一个部分 您可以在
  • 使用经过训练的分类器进行 NLTK 分类接口

    我找到了一小块代码here http streamhacker com 2010 05 10 text classification sentiment analysis naive bayes classifier import nltk
  • 扩展 jQuery 核心的用处

    我发现了一种扩展核心 jQuery init 函数的方法 每当您使用 或 jQuery 函数时都会调用该函数 使用普通代理模式不可能做到这一点 但以下代码可以使其工作 var origInit jQuery fn init jQuery f
  • DB2级联删除命令?

    是否有特殊的语法来在 DB2 上执行级联删除 或者是否只能通过使用 ON DELETE CASCADE 选项定义它们来创建 可级联 表 我想要实现的是 当我删除该键时 删除基于相同外键的其他表行 但这是在已经存在且填充数据的数据库上完成的
  • 如何迭代到较小的容器(即步幅!= 1)

    有一个问题在精神上很相似here https stackoverflow com questions 2476425 c stl stdtransform with given stride 不幸的是 这个问题没有引起太多回应 我想我会问一
  • Twitter bootstrap 响应式布局中的最小宽度

    有没有办法告诉 bootstrap 当分辨率小于以下值时不要缩小元素 Portrait tablet to landscape and desktop media min width 768px and max width 979px 我想
  • 如何将有理数格式化为小数?

    给定一个任意大 或小 Rational具有有限十进制表示形式的数字 例如 r Rational 1 2 15 gt 1 32768 如何以字符串形式获取其完整的十进制值 上述数字的预期输出是 0 000030517578125 to f显然