python的浮点数算法

       本菜基本完结了pos机的第二个页面,但是还是遇到了不少问题,本次总结其中之一,浮点数的计算。

       统计商品数量时,本来是直接加一就可以,但是本菜觉得应该照顾一下论斤买的商品,于是直接把 += 1 改为了 +=0.5,于是网页干干脆脆的报错不显示了,本菜通过强化过的报错函数,发现错误在于数据类型不正确,报的错误是:TypeError at /item/ unsupported operand type(s) for +=: 'decimal.Decimal' and 'float',decimal意为十进制,也就是说十进制和浮点型数因为类型不同不能运算,js中可以直接计算的内容到了python 竟然连加法都不能通常计算,于是本菜找到的方法是将浮点型转换为十进制小数,即:number = Decimal('data')由于在  django  框架,于是视图中添加  from decimal import Decimal.

       本菜还特意查询过了python语言内的数据计算发现如下内容:

       首先在终端中,进入python语言环境,然后:

>>> 1/3
0.3333333333333333(16个3,共17位)
>>> 0.333333333333333*3
0.9999999999999989

       最后两位变成了 ’ 89 ‘,这应该是计算的错误,但是计算机连算数都算错还能干啥,真正的原因在于python只打印机器中存储的二进制值的十进制近似值,部分机器上即使打印的是正确的结果但是实际保存的最近似的二进制小数。

>>> 0.1+0.1+0.1==0.3
False

  这是本菜最感兴趣的地方,经过搜索后发现历史上,Python 提示符和内置的 repr() 函数选择一个 17 位精度的数字,0.10000000000000001。从 Python 3.1 开始,Python(在大多数系统上)能够从这些数字当中选择最短的一个并简单地显示 0.1。二进制浮点数计算有很多这样意想不到的结果。

>>> a = 1.345
>>> a.as_integer_ratio()
(6057341498813317, 4503599627370496)

 当你真的想要知道浮点数精确值的时候,Python 提供这样的工具可以帮助你.float.as_integer_ratio() 方法以分数的形式表示一个浮点数的值.

>>> a == 6057341498813317/4503599627370496
True

 float.hex() 方法以十六进制表示浮点数,给出的同样是计算机存储的精确值:

>>> a.hex
<built-in method hex of float object at 0x7fdee0806fc0>

当计算量过大时许多语言会把结果舍入到 17 位有效数字,而不是显示全部的十进制值:

>>> 0.1 * 3**199
8.853799629195827e+93

 

猜你喜欢

转载自sodler.iteye.com/blog/2366722