RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1203610
Accepted
Danis
Danis
Asked:2021-11-12 19:10:00 +0000 UTC2021-11-12 19:10:00 +0000 UTC 2021-11-12 19:10:00 +0000 UTC

一个小数变成两个整数

  • 772

我已经实现了一个类Fraction,原始模块可以接受一个类型号float并将其转换为两个整数,一个分母和一个分子。我的版本不知道怎么实现这个,用什么算法

点播代码:

def NOD(a, b):
    while a and b:
        if a < b:
            b %= a
        else:
            a %= b
    return max(a, b)

def NOK(a, b):
    return a * b / NOD(a, b)


class fraction():
    def __init__(self, x, y = 1):
        self.x, self.y = x, y
    
    def __repr__(self):
        return f"{self.x} {self.y}"
    
    def __add__(self, other):
        n = NOK(self.y, other.y)
        
        d1, d2 = n / other.y, n / self.y
        
        return fraction(self.x * d1 + other.x * d2, n)
python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Zhihar
    2021-11-12T19:28:13Z2021-11-12T19:28:13Z

    嗯,首先,你可以做

    numerator = int(value * 100)
    denumerator = 100
    

    然后将分数减少到不可约

    gcd = math.gcd(numerator, denumerator);
    numenator //= gcd
    denumenator //= gcd
    

    您需要的精度越高,您需要的除数就越多

    在 C++ 中,我只需float将尾数作为整数取出,然后除以指数作为整数进行解析

    而在 python 中,理论上,使用它们的无限int,你可以简单地采用10**n一个超过大小的浮点数(Python 真实的似乎有双精度)

    附言

    理论上,任何实数都可以变成连分数

    维基百科

    如果已经定义了加分数的操作,那么最后你可以得到最接近所需实数的所需简单分数

    这种方法虽然相当慢(会有几个操作),但可能是最准确的

    • 4
  2. MarianD
    2021-11-12T21:02:30Z2021-11-12T21:02:30Z

    精确转换float为分数的说明:

    1. 使用 .转换float为精确的十六进制数作为字符串.hex()。

      例子:

      >>> x = -18.25
      >>> x.hex() 
      '-0x1.2400000000000p+4'
      

      您将始终获得相同的格式,整数部分后有一个点,字母后有 13 个十六进制数字和一个指数p。

    2. 此条目意味着

      -(1 + 2/16 + 4/16**2 + ... + 0/16**13) * 2**4
      

      或(减少到一个共同点后)

      -(1*16**13 + 2*16**12 + 4*16**11 + ... + 0) / 16**13 * 2**4 
      

      或(乘分数后)

      -(1*16**13 + 2*16**12 + 4*16**11 + ... + 0) * 2**4 / 16**13
      
    3. 现在很清楚了

      • 分子将-(1*16**13 + 2*16**12 + 4*16**11 + ... + 0) * 2**4是
      • 分母将16**13(总是)。
    • 3
  3. Danis
    2022-02-14T02:26:44Z2022-02-14T02:26:44Z

    float,int和一些其他类型有一个方法as_integer_ratio,它返回两个元素的元组,分子和分母。

    例子

    print((15).as_integer_ratio())
    print((0.76).as_integer_ratio())
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5