返回介绍

分数类型

发布于 2024-01-29 22:24:17 字数 2204 浏览 0 评论 0 收藏 0

Python 2.6和Python 3.0引入了一种新的数字类型——分数,它实现了一个有理数对象。它明确地保留一个分子和一个分母,从而避免了浮点数学的某些不精确性和局限性。

基本知识

分数是前面小节所介绍的已有的小数固定精度类型的“近亲”,它们都可以通过固定小数位数和指定舍入或截断策略来控制数值精度。分数以类似于小数的方式使用,它也存在于模块中;导入其构造函数并传递一个分子和一个分母就可以产生一个分数。下面的交互式例子展示了如何做到这一点:

一旦创建了分数,它可以像平常一样用于数学表达式中:

分数对象也可以从浮点数字符串来创建,这和小数很相似:

数值精度

注意,这和浮点数类型的数学有所区别,那是受到浮点数硬件的底层限制的约束。相比较而言,这里与对浮点数对象执行的操作是相同的,注意它们有限的精度:

对于那些用内存中给定的有限位数无法精确表示的值,浮点数的局限尤为明显。分数和小数都提供了得到精确结果的方式,虽然要付出一些速度的代价。例如,在下面的例子中(重复前一小节的),浮点数并没有准确地给出期望的0的答案,但其他的两种类型都做到了:

此外,分数和小数都能够提供比浮点数更直观和准确的结果,它们以不同的方式做到这点(使用有理数表示以及通过限制精度):

实际上,分数保持精确性,并且自动简化结果。继续前面的交互例子:

转换和混合类型

为了支持分数转换,浮点数对象现在有一个方法,能够产生它们的分子和分母比,分数有一个from_float方法,并且float接受一个Fraction作为参数。跟踪如下的交互看看这是如何做到的(第二个测试中的*是一种特殊的语法,它把一个元组扩展到单个的参数中;当我们在第18章中学习函数参数的时候再详细地讨论这一点):

最终,表达式中允许某些类型的混合,尽管Fraction有时必须手动地传递以确保精度。研究如下的交互示例来看看这是如何做到的:

警告:尽管可以把浮点数转换为分数,在某些情况下,这么做的时候会有不可避免的精度损失,因为这个数字在其最初的浮点形式下是不精确的。当需要的时候,我们可以通过限制最大分母值来简化这样的结果:

要了解有关分数类型的更多细节,自己进一步体验,并且查询Python 2.6和Python 3.0的库手册以及其他的文档。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文