【发布时间】:2010-05-21 04:48:36
【问题描述】:
奇怪的情况,当执行以下代码行时:
const float a = 47.848711;
const float b = 47.862952;
float result = b - a;
我得到 (NSLog %.10f) 结果 = 0.0142440796。
我预计会得到 0.0142410000。
发生了什么事?
【问题讨论】:
标签: iphone objective-c
奇怪的情况,当执行以下代码行时:
const float a = 47.848711;
const float b = 47.862952;
float result = b - a;
我得到 (NSLog %.10f) 结果 = 0.0142440796。
我预计会得到 0.0142410000。
发生了什么事?
【问题讨论】:
标签: iphone objective-c
经典!
What Every Computer Scientist Should Know About Floating-Point Arithmetic
(基本上,浮点数可能不准确;wikipedia)。
【讨论】:
如果我问你以下问题怎么办:
const int a = 1.3; const int b = 2.7; int result = b - a;我得到 (NSLog %d) 结果 = 1。
我预计会得到 1.4。怎么回事?
在这种情况下,答案是显而易见的,对吧? 1.3 不是整数,因此存储在a 中的实际值是 1,而存储在b 中的值不是 2.7,而是 2。当我从 2 中减去 1 时,我得到的正好是 1 ,这是观察到的答案。如果到目前为止你和我在一起,请继续阅读。
在您的示例中也发生了完全相同的事情。 47.848711 不是单精度浮点数,因此最接近的浮点值存储在 a 中,确切地说是:
a = 47.8487091064453125
同样,b 中存储的值是最接近47.862952 的浮点值,即:
b = 47.86295318603515625
当你减去这些数字得到result,你得到:
47.86295318603515625
- 47.8487091064453125
----------------------
0.01424407958984375
当您将该值四舍五入到 10 位以打印出来时,您会得到:
0.0142440796
【讨论】: