C-C float数据的一个问题

发布于 2016-11-01 08:22:31 字数 116 浏览 1242 评论 2

int a = ( 4.35 + 4.35 ) * 100
结果a的值为869而不是870,stack over 上有帖子说这是因为不能准确的表示4.35取而代之的是4.349999....,但这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瑾兮 2017-09-03 21:48:37

4.35用二进制表示为100.01011001100110011001100110011001···
100为1100100
你将这些带入进去,最后取小数点之前,应该答案就是869
我没有算过,你可以照这个思路试试,计算机毕竟使用二进制计算的

瑾兮 2016-11-29 00:23:06

浮点数 按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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文