C-C float数据的一个问题
int a = ( 4.35 + 4.35 ) * 100
结果a的值为869而不是870,stack over 上有帖子说这是因为不能准确的表示4.35取而代之的是4.349999....,但这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
int a = ( 4.35 + 4.35 ) * 100
结果a的值为869而不是870,stack over 上有帖子说这是因为不能准确的表示4.35取而代之的是4.349999....,但这是为什么呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
4.35用二进制表示为100.01011001100110011001100110011001···
100为1100100
你将这些带入进去,最后取小数点之前,应该答案就是869
我没有算过,你可以照这个思路试试,计算机毕竟使用二进制计算的
浮点数 按IEEE 754来处理, 对于float来说, 是用32bit来表示.
对3.45来说, 这个32bit为:
01000000 10001011 00110011 00110011
对应的16进制为:
408b3333
按照IEEE 754的算法:
int s = ((bits >> 31) == 0) ? 1 : -1;
int e = ((bits >> 23) & 0xff);
int m = (e == 0) ? (bits & 0x7fffff) << 1
: (bits & 0x7fffff) | 0x800000;
最终结果为:
s * m * Math.pow(2, e - 150)
我用java的BigDecimal(这样可以保证精度不丢失)算了下, 在内存里保存的这个准确值为:
4.349999904632568359375
这个数的200倍为:
869.999980926513671875000
所以转为int后, 去掉了小数点后面的值, 给出结果为689
PS:
一般计算机里的浮点运算都是通过硬件实现, 所以结果出来之后不一定是869.999980926513671875000