ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

浮点运算-争议与思考_python_2021-07-05

2021-07-05 11:33:41  阅读:213  来源: 互联网

标签:10 07 05 python Decimal float 0.1 Fraction round


1、十进制的数往往无法被二进制精确表示
2、python一般保证小数点后16位正确,从17位开始出现误差

0.1+0.1+0.1 == 0.3  --> False,  
round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)  --> False

3、限定输出位数:format(math.pi, ‘.2f’)=>‘3.14’
4、需要精确十进制表示:decimal,fractions
5、经常使用浮点运算,考虑Numpy,Scipy
6、python自带: float.as_integer_ratio(), float.hex()(以16进制保存精确值)

	>>> x = 3.14159
	>>> x.as_integer_ratio()
	(3537115888337719, 1125899906842624)
	>>> x == 3537115888337719 / 1125899906842624
	True
	
	>>> x.hex()
	'0x1.921f9f01b866ep+1'
	>>> x == float.fromhex('0x1.921f9f01b866ep+1')
	True

7、十六进制表示:由于这种表示法是精确的,它适用于跨越不同版本(平台无关)的 Python 移植数值,
以及与支持相同格式的其他语言(例如 Java 和 C99)交换数据。
8、math.fsum(),减少求和过程中的精度损失

	sum([0.1] * 10) == 1.0
	False
	math.fsum([0.1] * 10) == 1.0
	True

9、decimal, fractions举例

	>>> from decimal import Decimal
	>>> from fractions import Fraction

	>>> Fraction.from_float(0.1)
	Fraction(3602879701896397, 36028797018963968)

	>>> (0.1).as_integer_ratio()
	(3602879701896397, 36028797018963968)

	>>> Decimal.from_float(0.1)
	Decimal('0.1000000000000000055511151231257827021181583404541015625')

	>>> format(Decimal.from_float(0.1), '.17')
	'0.10000000000000001

10、要想0.1+0.1+0.1 == 0.3,有两种方式
①、事后舍入,小数点后小于17位
round(.1 + .1 + .1, 10) == round(.3, 10)
②、使用分数运算
Fraction(‘0.1’) + Fraction(‘0.1’) + Fraction(‘0.1’) == Fraction(‘0.3’)
注意:一定要加上引号,否则无法获取精确的分数

标签:10,07,05,python,Decimal,float,0.1,Fraction,round
来源: https://blog.csdn.net/qq_32317813/article/details/118485419

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有