Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 蟒蛇3奇怪的浮球_Python 3.x_Math - Fatal编程技术网

Python 3.x 蟒蛇3奇怪的浮球

Python 3.x 蟒蛇3奇怪的浮球,python-3.x,math,Python 3.x,Math,有人能解释一下为什么我没有得到166.9(我知道有一个round()函数),我只是想理解一下。:) 这是因为计算机中的数字是以二进制形式表示的。这不仅在Python中存在,而且在计算机中也普遍存在。浮点数字在Python中以64位存储。1位表示符号,52位表示尾数,11位表示指数。要从这三个分量中获得十进制值,计算机将执行符号*尾数*2^指数 并非所有的数字都能以这种形式完美地存储。只有52位来存储数字。例如,11.3不能完美地存储在该表单中,您可以使用该表单查看数字的精确值 from deci

有人能解释一下为什么我没有得到166.9(我知道有一个round()函数),我只是想理解一下。:)


这是因为计算机中的数字是以二进制形式表示的。这不仅在Python中存在,而且在计算机中也普遍存在。

浮点数字在Python中以64位存储。1位表示符号,52位表示尾数,11位表示指数。要从这三个分量中获得十进制值,计算机将执行符号*尾数*2^指数

并非所有的数字都能以这种形式完美地存储。只有52位来存储数字。例如,11.3不能完美地存储在该表单中,您可以使用该表单查看数字的精确值

from decimal import Decimal
print(Decimal(11.3))
当您添加165.0+1.45+0.45时

>>> print(Decimal(165))
165
>>> print(Decimal(1.45))
1.4499999999999999555910790149937383830547332763671875
>>> print(Decimal(0.45))
0.450000000000000011102230246251565404236316680908203125
实际上,您并没有添加这些精确的值


有关浮点数系统的更多信息,请访问。

因为@JonathonReinhart是我做的,所以您的comment@JonathonReinhart这真的很奇怪,我的标志选项是灰色的,所以我肯定标记为duplicate@JonathonReinhart他只有代表权,不关闭VOTEI只是所有使用二进制浮点运算的机器都有舍入问题,0.45和1.45在转换为二进制时有一个无限的十进制展开,所以在内部使用近似值。我的2欧元计算可以处理这个计算。。。这个simpec程序找到了正确的答案:#include int main(){printf(“%f\n”,165.0+1.45+0.45);返回0;}当然是。查看有关此主题的链接。简单地说,您的计算器内部也有二进制形式的数字,内部表示为1.45之类的数字,例如1.44999999999999。但是他没有那么多地方给你看他的内部号码,所以他把它四舍五入,然后在显示屏上显示1.45。但计算机在内存中有更多的空间,他不必为你们们对它进行取整,所以他在二进制形式中有更高的精度,如果不需要的话,也不会对它进行取整。矛盾的是,它周围的设备更便宜,对我们来说似乎更准确,但在内部却不是。您的示例很好,但您必须知道格式化
%f\n“
意味着什么。例如,尝试使用此格式
“%.30f\n”
。它将有三十个小数点。结果是:166.89999999977262632455676794。整个程序:
#include int main(){printf(“%.30f\n”,165.0+1.45+0.45);返回0;}
>>> print(Decimal(165))
165
>>> print(Decimal(1.45))
1.4499999999999999555910790149937383830547332763671875
>>> print(Decimal(0.45))
0.450000000000000011102230246251565404236316680908203125