有一些float值不能表示的int值.
但是,double可以表示float可以表示的所有值吗?
我的直觉说是的,因为double有更多的分数位更多的指数位,但可能会有一些愚蠢的陷阱,我失踪了.
解决方法
是.
这可能有助于了解浮标和双打如何工作.
没有太多的细节…
拿数字152853.5047(木星的月亮的转动时间在几秒钟内)
以科学计数,这个数字是0.1528535047×10 ^ 6
由于电脑只能理解1和0,所以有办法定义.
尾数(1528535047)和指数(6)存储在32位…如果我记得正确,只有24位用于尾数,所以浮点通常更多的是精度大于大小.数字越大,其精度就越低.
1528535047 = 1011011000110111001100000000111所以你只能存储第一个24位…最后三个1被丢弃.
因为整数是32位,你是对的,一个浮点不能准确地包含它.不太有意义的数字最终被淘汰.
绝对值小于2 ^ 24(24位)的任何整数都可以存储而不会损失精度. (16777216)
这些位是如何以浮点数存储的:
source
符号为1位,指数为8位,尾数为23位.因此,为了回答您的问题,由于只为尾数保留23位,因此无法精确显示32位整数.它将迅速开始删除数字(从右边),因为有更多的数字需要显示.
对于双倍,你只是增加它可以存储的位数…事实上,它被称为双精度,所以可以显示为浮点数的任何数字都能被显示为双精度.额外的0只是添加到尾数.
因此,由于双倍占用64位,因此从32位int转换为双精度时,大多数人将使用双精度.浮点数将有利于转换16位的空格.