我知道 float 包含大量数字和一些基数的指数,通常是十。因此,超过有效数字的任何内容都不会准确,因为那里什么也没有,但是当将 float 转换为 int(或 long)时,会出现虚假数字。
这是一个 Python 示例:
>>> int(1e308)
100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336L
当一遍又一遍地赋予相同的值时,它们似乎并没有改变,所以它可能不是完全随机的,也不是从内存中的某个神秘点拉出来的。这些随机数字从何而来?产生这些尾随数字到底发生了什么?为什么转换不简单地将随机数字设置为零?
最佳答案
它们不是随机的!并且转换确实将所有“随机”数字设置为零。只是不在十进制!
在 Python(2.6 及更高版本)中,您可以调用 .hex()
在任何浮点值上更容易地看到它是如何存储的。使用 1e308
,您将获得 '0x1.1ccf385ebc8a0p+1023'
。在右侧,您会看到将左侧的十六进制值提高为输入值所需的 2 的幂。在二进制中,十六进制值为 1.00011100110011110011100001011110101111001000101
。
将它乘以 2^1023 只是将小数点移动了 1023 个位置
1000111001100111100111000010111101011110010001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
这正是 int(1e308)
。从 float 到 integer 的转换只是简单地将小数点移动到基数 2,并丢弃其余部分。
关于python - 将 float 转换为 int 时,尾随数字从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033918/