Objective c 从函数中经过时的浮点值再次不相同
问题是在我写的一个类中发现的,我发现19.8851过去到%f,只得到19.88509,这是因为浮点不能保存太多的分数部分吗Objective c 从函数中经过时的浮点值再次不相同,objective-c,Objective C,问题是在我写的一个类中发现的,我发现19.8851过去到%f,只得到19.88509,这是因为浮点不能保存太多的分数部分吗 // // 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 ge
//
// 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;
}
在计算机上,浮点值
19.8851
实际上与浮点值19.885099
相同。这就是计算机十进制数存储的工作原理。这就是为什么您永远不会使用==
来比较它们。你可以把它们比作小ε;例如:
if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等
在计算机上,浮点值19.8851
实际上与浮点值19.885099
相同。这就是计算机十进制数存储的工作原理。这就是为什么您永远不会使用=
对它们进行比较。您会将它们与一些小ε进行比较;例如:
if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等
在计算机上,浮点值19.8851
实际上与浮点值19.885099
相同。这就是计算机十进制数存储的工作原理。这就是为什么您永远不会使用=
对它们进行比较。您会将它们与一些小ε进行比较;例如:
if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等
在计算机上,浮点值19.8851
实际上与浮点值19.885099
相同。这就是计算机十进制数存储的工作原理。这就是为什么您永远不会使用=
对它们进行比较。您会将它们与一些小ε进行比较;例如:
if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等
float
通常使用IEEE 754-2008 32位base 2格式调用来实现
由于此格式基于2次幂而非10次幂,因此19.8851
的值不可精确表示。最接近的两个选择是
19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从getafloat()
返回的
打印此值时,除非另有说明,否则将打印到小数点后6位,即
19.885099
float
通常使用IEEE 754-2008 32位base 2格式调用来实现
由于此格式基于2次幂而非10次幂,因此19.8851
的值不可精确表示。最接近的两个选择是
19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从getafloat()
返回的
打印此值时,除非另有说明,否则将打印到小数点后6位,即
19.885099
float
通常使用IEEE 754-2008 32位base 2格式调用来实现
由于此格式基于2次幂而非10次幂,因此19.8851
的值不可精确表示。最接近的两个选择是
19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从getafloat()
返回的
打印此值时,除非另有说明,否则将打印到小数点后6位,即
19.885099
float
通常使用IEEE 754-2008 32位base 2格式调用来实现
由于此格式基于2次幂而非10次幂,因此19.8851
的值不可精确表示。最接近的两个选择是
19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从getafloat()
返回的
打印此值时,除非另有说明,否则将打印到小数点后6位,即
19.885099
您是否尝试过使用
%.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
您是否尝试过使用
%.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
您是否尝试过使用
%.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
您是否尝试过使用
%.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
听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用:非常好的解释!@slboat注意:作为参考,答案(C)关于显示FP可能有用:非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用:非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用: