show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次了解Fraction(分数)类型变量
- Fraction(分数)类型有三种初始化方法
- 用小数当参数
- 用整数当分子和分母
- 用字符串
- 关于精度
- 由于二进制无法精确对应十进制小数
- 所以用分数
- 遇到了一个decimal.Decimal("1.47")
- decimal是一个模块(module)
- 源代码位置在
/usr/lib/python3.8/decimal.py
- decimal里面有什么
- 这是一个十进制的
- 可进行数学运算的模块
- 看起来可以试试
- 好像并不精准
- 这可不行啊?!🤔
- 说好的精确十进制呢?
- decimal 模块中主要用的是 Decimal 类
- 应该可以用
字符串
来初始化Decimal的对象 - 有双引号的字符串参数才构成精确的0.1
- decimal.Decimal("0.1")是精确0.1
- decimal.Decimal(0.1)是ieee-754中的双精度数值
- 近似0.1
- 但不精确
- 确实可以精准地进行运算
- 不怕算账了
- 可以转化为分数吗?
- 精确十进制类型的变量可以转化为分数
- 那反过来可以么?
- 分数看起来不能转化为精确十进制数
- 看起来精确十进制数是更为基础的类型
- 但是1/3这种无限不循环小数是如何表示呢?
- 除法可以做
- 得到的还是一个精确十进制数类型的
- 但是精度有限
- 毕竟不是无限小数
- 可以控制精度么?
- 去试试
- 好像到一定精度就不好使了
- 边界在哪呢?
- 一步步试
- 这个边界还能调么?
- 查询类的帮助
- 在查询模块的帮助
- 好像可以设置上下文
- 上下文里面是否包括精度位数呢?
- 精度28位可以改到30位
- 但因为原来的decimal.Decimal类的变量的精度就是28位
- 所以精度可以达到但是数值还是原来的
- 我就想计算出1/3,有效精度30位
- 怎么办?
- 从28位修改为30位之后
- 原来的数字会在末尾补0
- 31位的精度还是到不了
- 但是30位的精度确实是可以的
- Decimal还有什么好处呢?
- 毕竟Guido是从数学研究所出来的
- 精确计算没有问题
- 根号2小数点后保留1000位
- 非常快速
- 不仅不用管算法细节
- 而且计算速度还非常快!!!😄
- 即使是默认28位的精度
- 也远超目前的精度描述方式
- 目前精度系统yocto精确到小数点后24位
Value | Symbol | English standard | 中文 |
---|---|---|---|
10-1 | d | deci | 分 fēn |
10-2 | c | centi | 厘 lí |
10-3 | m | milli | 毫 háo |
10-6 | µ | micro | 微 wēi |
10-9 | n | nano | 纳 nà |
10-12 | p | pico | 皮 pí |
10-15 | f | femto | 飞 fēi |
10-18 | a | atto | 阿 à |
10-21 | z | zepto | 仄 zè |
10-24 | y | yocto | 幺 yāo |
- Decimal精确到小数点后28位
- 默认的就很厉害了
- 先去总结Decimal吧
- Decimal是精确十进制类型的变量
- 可以以字符串作为参数
- 可以直接进行运算
- 比Fraction更适合做基础
- 如果精度不够
- 可以把上下文中的 精度(prec)提高
- 这样就可以体高精度了
- 例子里面有个1e-2 这是什么意思?🤪
- 下次再说 👋