浮点数在计算机中表达为二进制(binary)小数。例如:十进制小数:

0.125

是 1/10 + 2/100 + 5/1000 的值。

类似地,二进制小数:

0.001

是 0/2 + 0/4 + 1/8。

这两个数在字面上的数字相同。唯一的实质区别是第一个写为十进制小数记法,第二个是二进制。

不幸的是,大多数十进制小数不能完全用二进制小数表示。结果是,一般情况下,开发者输入的十进制浮点数仅由实际存储在计算机中的近似的二进制浮点数表示。

这个问题更早的时候首先在十进制中发现。考虑小数形式的 1/3 ,我们先可以提供一个十进制的近似值。

0.3

或者更进一步的,

0.33

或者更进一步的,

0.333

诸如此类。无论我们写多少位,这个结果永远不是精确的 1/3 ,但是只要不断写下去就可以无限接近 1/3 。

同样,无论在二进制中写多少位,十进制数 0.1 都不能精确表达为二进制小数。二进制来表达 1/10 是一个无限循环小数:

0.0001100110011001100110011001100110011001100110011...

在任何有限数量的位停下来,我们得到的都是近似值。今天在大多数机器上,浮点数的近似使用的小数以最高的 53 位为分子,2 的幂为分母。至于 1/10 这种情况,其二进制小数是

3602879701896397 / 2 ** 55

它非常接近但不完全等于1/10真实的值。

在许多数机器上,如果 Python 要打印 0.1 存储的二进制的真正近似值,将会显示:

0.1000000000000000055511151231257827021181583404541015625

这么多位的数字对大多数人是没有用的,所以 Python 显示一个舍入后的值:

0.1

只要记住即使打印的结果看上去是精确的 1/10,真正存储的值是最近似的二进制小数。

有趣地是,存在许多不同的十进制数共享着相同的近似二进制小数。例如,数字 0.1 和 0.10000000000000001 以及 0.1000000000000000055511151231257827021181583404541015625 都是 3602879701896397 / 2 ** 55 的近似值。因为所有这些十进制数共享相同的近似值,在保持恒等式 eval(repr(x)) == x 的同时,显示的可能是它们中的任何一个。

历史上,Python 提示符和内置的 repr() 函数选择一个 17 位精度的数字,0.10000000000000001。从 Python 3.1 开始,Python(在大多数系统上)能够从这些数字当中选择最短的一个并简单地显示 0.1。

注意,这是二进制浮点数的自然性质:它不是 Python 中的一个 bug,也不是开发者的代码中的 bug。用户会看到所有支持硬件浮点数算法的语言都会有这个现象(尽管有些语言默认情况下或者在所有输出模式下可能不会 显示 出差异)。

为了输出更好看,我们可以用字符串格式化来生成固定位数的有效数字:

认识到这一点很重要:开发者应当知道自己是在简单地舍入真实机器值的显示。

例如,既然 0.1 不是精确的 1/10,3 个 0.1 的值相加可能也不会得到精确的 0.3:

另外,既然 0.1 不能更接近 1/10 的精确值而且 0.3 不能更接近 3/10 的精确值,使用 round() 函数提前舍入也没有帮助:

虽然这些数字不可能再更接近它们想要的精确值,round() 函数可以用于在计算之后进行舍入,这样的话不精确的结果就可以和另外一个相比较了:

二进制浮点数计算有很多这样意想不到的结果。

最后我们要说,虽然对于不同场景下浮点数的处理“没有统一的答案”,但也不要过分惧怕浮点数。Python 浮点数计算中的误差源之于浮点数硬件,大多数机器上每次计算误差不超过 2**53 分之一。对于大多数任务这已经足够了,但是开发者要在心中记住这不是十进制算法,每个浮点数计算可能会带来一个新的舍入错误。

虽然确实有问题存在,对于大多数平常的浮点数运算,开发者只要简单地将最终显示的结果舍入到自己期望的十进制位数,就会得到自己期望的最终结果。str() 通常已经足够用了,对于更好的控制可以参阅 格式化字符串语法中 str.format() 方法的格式说明符。

对于需要精确十进制表示的情况,可以尝试使用 decimal 模块,它实现的十进制运算适合会计方面的应用和高精度要求的应用。

fractions 模块支持另外一种形式的运算,它实现的运算基于有理数(因此像1/3这样的数字可以精确地表示)。

如果开发者是浮点数操作的重度使用者,可以看一下由 SciPy 项目提供的 Numerical Python 包和其它用于数学和统计学的包。

— — — — — — E N D — — — — — —

真格量化可访问:

https://quant.pobo.net.cn

真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群 726895887

往期文章:

Numpy处理tick级别数据技巧

真正赚钱的期权策略曲线是这样的

多品种历史波动率计算

如何实现全市场自动盯盘

AI是怎样看懂研报的

真格量化策略debug秘籍

真格量化对接实盘交易

常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法

如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

活用订单类型规避频繁撤单风险

真格量化回测撮合机制简介

如何调用外部数据

如何处理回测与实盘差别

如何利用趋势必然终结获利

常见量化策略介绍

期权交易“七宗罪”

波动率交易介绍

推高波动率的因素

波动率的预测之道

趋势交易面临挑战

如何构建知识图谱

机器学习就是现代统计学

AI技术在金融行业的应用

如何避免模型过拟合

低延迟交易介绍

架构设计中的编程范式

交易所视角下的套利指令撮合

距离概念与特征识别

气象风险与天气衍生品

设计量化策略的七个“大坑”

云计算在金融行业的应用

机器学习模型评估方法

真格量化制作期权HV-IV价差

另类数据介绍

TensorFlow中的Tensor是什么?

机器学习的经验之谈

用yfinance调用雅虎财经数据

容器技术如何改进交易系统

Python调用C++

如何选择数据库代理

统计套利揭秘

一个Call搅动市场?让我们温习一下波动率策略

如何用真格量化设计持仓排名跟踪策略

还不理解真格量化API设计?我们不妨参考一下CTP平台

理解同步、异步、阻塞与非阻塞

隐波相关系数和偏度——高维风险的守望者

Delta中性还不够?——看看如何设计Gamma中性期权策略

Python的多线程和多进程——从一个爬虫任务谈起

线程与进程的区别
皮尔逊相关系数与历史K线匹配

Python2和Python3的兼容写法
Python代码优化技巧

理解Python的上下文管理器

如何写出更好的Python代码?这是Python软件基金会的建议

评估程序化模型时我们容易忽视的指标

看看如何定位Python程序性能瓶颈

什么是Python的GIL

投资研究中的大数据分析趋势及应用

理解CTP中的回调函数

如何围绕隐含波动率设计期权交易策略

看看如何用Python进行英文文本的情感分析

算法交易的分类

Python编码的最佳实践总结

什么是波动率锥?如何用波动率锥设计期权策略?

期权的波动率策略与时间价值收集策略对比

期权用于套期保值和无风险套利

隐含波动率对期权策略的影响

卖出期权交易的风险管理原则和技巧

期权交易中的“大头针”风险

期权做市商策略简介

精细化您的交易——交易成本评估与交易执行策略

海外市场交易执行策略的实践

设计期权套期保值方案时应注意的问题

美式期权、欧式期权比较分析——定价与风险管理

构建您的AI时代武器库——常用的机器学习相关Python库

期权波动率“微笑曲线”之谜

运算任务愈发繁重,如何加速Python程序运行?

证券市场微观结构理论模型是什么

是瞬间成交还是漫长等待?——如何衡量市场流动性

波动率指数及其衍生品介绍

Python的异常处理技巧

Python中的阻塞、异步与协程

"香草"之外的更多选择——几种常见的路径依赖奇异期权

什么是CTP?——了解上期所CTP快速交易系统

了解季节性——以谷物和油籽为例

是前因还是后果?——在真格量化中进行格兰杰因果检验

Python导入模块的技巧

Python程序员常犯的十个错误

搜索数据泄露天机?——舆情指数与期货行情关联性分析思路

机器学习常见算法分类汇总

如何使用Data Pipeline 自动化数据处理工作?

CTP API的委托介绍和在真格量化中的订单流控制

高频交易对市场的影响

期货行情及其组织形式——以上期所为例

理解并行与并发

郑商所和大商所套利指令及在真格量化的实现

机器学习用于金融市场预测面临的挑战

高频交易中风险控制的常用措施

查询结果偏离预期?来了解CTP的报单函数及委托状态查询

Python中的ftplib模块

理解真格量化的Python编程范式

需要处理大量市场数据?来了解一下MySQL、HBase、ES的特点和应用场景

NumPy中的ndarray与Pandas的Series和DataFrame之间的区别与转换

python 浮点数比较_Python中的浮点数相关推荐

  1. python运算结果是浮点数_Python中的浮点数原理与运算分析 python中浮点数等于整数?为什么?...

    python的浮点数运算是不是精度有问题阿 python中浮点数的处理女生啊,平时要好好护肤,保持身材,多看书,多旅行,有自己的想法,去做自己喜欢的事,培养自信,不要把精力全部用在一个男人身上,成天胡 ...

  2. python浮点数的表示方法_python中的浮点数range方法

    我们知道python中有个range函数用来产生一个范围内的数字数组,但是浮点数没有,我们来定义一个 #python中的range函数支持步进,如下: >>> print range ...

  3. python map用法_Python中ChainMap的一种实用用法

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 简而言之ChainMap:将多个字典视为一个,解锁Python超能力. Python标准库中的集合模块包含 ...

  4. python基本统计量_Python中简单统计量的计算

    本篇文章给大家带来的内容是关于Python中简单统计量的计算,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.这些操作都要确保已经在电脑中安装好了Anaconda集成库,如果安装好 ...

  5. python解析原理_Python 中 -m 的典型用法、原理解析与发展演变

    在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...

  6. python正则表达式空格_python中的正则表达式的使用

    一.正则表达式简介 正则表达式:又称正规表示式.正规表示法.正规表达式.规则表示式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或者是RE),是计算 ...

  7. python wraps模块_python中 wraps 的作用

    这里使用两段代码比较加入wraps装饰器后,函数打印的结果对比: 新建文件名:Testword 代码1:不加wraps装饰器 # coding=utf-8 from functools import ...

  8. 用python输出数组_Python 中输出数组中的全部元素

    只需要在开头加上一句即可 import numpy as np np.set_printoptions(threshold=np.inf) Python 输出到文本中 参考:https://blog. ...

  9. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...

    我要说的是,您的观察表明这两个操作应该在直观上相似,因为在正数上它们的行为相同.但是,如果您查看它们的起源(一个来自数学,另一个来自计算机科学),那么它们的不同行为更有意义. 您可以在其中查看概念: ...

最新文章

  1. [微信小程序]js动态改变数组对象列表中的样式
  2. java管理系统用怎么框架做_java 使用servlet做学生管理系统(无框架)
  3. 强制解包看 Swift 的设计
  4. 使用PIE/PIF值判断DVD刻录机的刻录品质
  5. exec 和 call 用法详解
  6. oracle tarmout off,如何关闭oracle rac选项 make rac_off
  7. 抓包工具-charles安装过程
  8. android+统计功能,React Native 轻松集成统计功能(Android 篇)
  9. 你用java的swing可以做出这么炫的mp3播放器吗?
  10. global mapper加载高德在线地图
  11. 串口通信简介——发展历史与基本概念
  12. 点赋科技:网店的营销策略是什么?
  13. 如何在2015年后的MacBook Air上安装双系统
  14. 微信公众平台开发(56)优惠券
  15. web网页设计期末课程大作业——简单的学生网页作业源码 基于HTML仿唯品会电商项目的设计与实现
  16. java从数据库读取zip文件的字节数组byte[]直接解压
  17. 将tensorflow模型转换为uff模型
  18. SpringCloud Alibaba Sentinel实现熔断与限流
  19. Apache Ranger and AWS EMR Automated Installation Series (3): Windows AD + EMR-Native Ranger
  20. 三次蝉联!Stratifyd在G2 2021秋季报告中再获“高成长者”荣誉

热门文章

  1. 怎样用git获取指定的android linux kernel
  2. 企业SpringBoot 教程(五)springboot整合beatlsql
  3. Matlab for循环subplot画图加标题
  4. Kubernetes Secret
  5. js设计模式之观察者模式和发布/订阅模式
  6. iOS开发实战小知识点(四)
  7. vue-Resource(与后端数据交互)
  8. HackerOne《2020年黑客驱动安全报告》:中国白帽子的收入增长幅度最大
  9. 谷歌8月更新修复50多个漏洞
  10. 信么?PrintDemon 漏洞影响自1996年起发布的所有 Windows 版本