//
// main.m
// 0.6 the_float_not_corrert
//
// Created by Sen on 7/4/14.
// Copyright (c) 2014 SLboat. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
* for get a float value from function
*
* @return a flaot value
*/
float getafloat(){
return 19.8851;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSLog(@"const 19.8851 is %f",19.8851);
NSLog(@"19.8851 is %f",getafloat());
float byValue = 19.8851;
NSLog(@"19.8851 pass in value is %f",byValue);
}
return 0;
}
这就是我得到的
2014-07-04 09:42:07.508 0.6 the_float_not_corrert[11540:303] const 19.8851 is 19.885100
2014-07-04 09:42:07.510 0.6 the_float_not_corrert[11540:303] 19.8851 is 19.885099
2014-07-04 09:42:07.511 0.6 the_float_not_corrert[11540:303] 19.8851 pass in value is 19.885099
Program ended with exit code: 0
答案 0 :(得分:2)
float
通常使用IEEE 754-2008 32位base 2格式调用实现binary32
由于此格式基于2的幂而不是10的幂,因此19.8851
的值不是完全可表示的。最接近的两个选择是
19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最近的值是从getafloat()
返回的。
打印此值时,除非另有说明,否则打印到小数点后的6个位置
19.885099
答案 1 :(得分:1)
在计算机上,浮动19.8851
实际上 与浮动19.885099
相同。这就是计算机十进制数存储的工作原理。这就是为什么你永远不会使用==
来比较它们。你可以将它们与一些小epsilon进行比较;例如:
if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
答案 2 :(得分:0)
您是否尝试使用%.4f
?
请看下面的例子:
@autoreleasepool {
NSLog(@"const 19.8851 is %.4f",19.8851);
NSLog(@"19.8851 is %.4f",[self getafloat]);
float byValue = 19.8851;
NSLog(@"19.8851 pass in value is %.4f",byValue);
}
输出:
2014-07-03 20:53:34.297 TestApp[721:907] const 19.8851 is 19.8851
2014-07-03 20:53:34.304 TestApp[721:907] 19.8851 is 19.8851
2014-07-03 20:53:34.305 TestApp[721:907] 19.8851 pass in value is 19.8851