python 浮点转整数,python中将浮点数转换成整数
问题
昨天,我遇到了一个问题。6.6045保留三位小数时,我们用round()函数来计算。我们希望得到6.605,但是:
圆形(6.6045,3)
6.604
网上有人说,由于计算机中小数不准确,比如1.115在计算机中实际上是1.1149999999991182,当cxdyc精确到小数点后两位时,小数点后第三位实际上是4,所以结果是1.11。
这个说法对了一半。
因为不是所有的小数在计算机中都是不准确的。比如十进制数0.125在计算机里是准确的,它是0.125。在不省略以下数值并近似的情况下,真的是0.125。
但是如果我们用Python运行:
四舍五入(0.125,2)
0.12
你为什么在这里?
更诡异的是另一个小数点0.375在电脑里也能准确表达。我们来看看什么是精确到小数点后两位:
四舍五入(0.375,2)
0.38
你为什么又来了?
分析
因为在Python3中,四舍五入到小数的精度是四比六比五十。
如果你写过大学物理的实验报告,那么你应该记得老师说过如果直接用四舍五入的方法,最后的结果可能会高,所以要用奇偶的方法。
比如浮点数a.bcd,需要精确到小数点后两位,所以取决于小数点后第三位:
如果d小于5,直接掉;
如果d大于5,直接进位;
如果d等于5:
d之后没有数据,c是偶数,不进位,保留c。
D之后没有数据,C是奇数,那么进位,C就变成(c 1)
如果D后面有一个非零的数,比如十进制数实际上是a.bcdef,那么必须进位,C就变成(c 1)
关于奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目
因此,如果round给出的结果与预期的不同,那么需要考虑两个原因:
你的这个小数能准确地储存在计算机里吗?如果不是,那么可能不符合四舍五入的标准,比如1.115,它的第三位小数实际上是4,当然会掉。
如果你的十进制数在计算机中能准确表示,那么round采用的进位机制就是奇偶舍入,所以要看你要保留哪一位,是奇数还是偶数,它的下一位之后有没有数据。
关于奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目奇数条目
回到最初的问题,对于浮点数6.6045,我们来看看它在Scheme中的确切形式:
(精确到6.6045)
3718002967371055/562949953421312
也就是说不能精确存储,大概是6.6049999999……的形式,所以四舍五入就是6.604。
怎么圆才正确?
如果要实现数学上的舍入,就需要使用小数模块。具体用法请参考官方文件:https://docs.python.org/zh-cn.
其中quantize函数的原型和文档描述中提到可以指定舍入参数来确定进位模式。如果未指定舍入参数,默认情况下将使用上下文提供的舍入方法。
现在让我们看看默认环境中的进位模式是什么:
从十进制导入获取上下文
getcontext()。舍入
“圆形一半偶数”
ROUND_HALF_EVEN其实是奇数偶数屋。如果您想要指定真正的舍入,那么我们需要在quantize中将进位模式指定为ROUND_HALF_UP:
从小数导入小数,ROUND_HALF_UP
十进制( 0.125 )。量化(十进制( 0.00 ),舍入=ROUND_HALF_UP)
十进制( 0.13 )
现在一切似乎都很正常。
有人可能会进一步问,如果Decimal收到的参数不是字符串,而是浮点数会怎么样?
让我们实验一下:
十进制(0.125)
十进制( 0.125 )
这是否意味着浮点数可以被传递
十进制( 11.4999999999921840299066388979551765640625 )
浮点数11.245和字符串“11.245”以不同的结果传入。
我们继续在文件中寻找答案:
官方文件已经明确说明,如果你传入的参数是浮点数,而浮点数在计算机中无法准确存储,那么会先转换成不准确的二进制值,再将不准确的二进制值转换成等价的十进制值。当cxdyc被引入到无法准确表示的小数时,这个数在Python得到它之前就已经被转换成不准确的数了。因此,尽管传入的参数是11.245,Python实际上得到的是11。46866.68668686661
摘要
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。谢谢你的支持。
题目:Python浮点数舍入问题的分析与解决
本文地址:http://www.cppcns.com/jiaoben/python/287393.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。