繁体   English   中英

在Objective-C(或C)中正确使用和格式化浮点数

[英]Proper Usage and Formatting of a Float in Objective-C (or C)

我有一个iPhone应用程序。 我在sqlite3数据库中存储一个浮点值(距离)。 (db中的字段被格式化为float)我能够在db中正确存储float值没问题。 但是,我似乎无法弄清楚如何将值从db格式中拉回并正确显示。 这是我的代码,用于从数据库中提取值并使用它:

NSString *itemDistance = [NSString stringWithFormat:@"%f",[item distance]];
float questionDistance = [itemDistance floatValue];

[项目距离]是一个浮动值。 我无法使它正常工作。 我得到了一个很长的值。 我究竟做错了什么? 任何帮助将不胜感激。

预先感谢您的帮助,

L.

假设您的-distance方法返回正确的值,那么这听起来像是对float如何在C中工作的基本误解。常见错误。 每个开发人员至少会陷入此陷阱一次。

浮点数实际上只能表示数量有限的值。 具体而言,除非您碰巧选择了一个可以精确表示为浮点数的值,否则您将获得最接近的值,该值通常具有许多小数位数据。

原因是浮点数只有32位; 4字节。 现在,在0..1000000或0..1000或什至0..1之间有多少个带小数点的数字。 无穷。 浮点数实现了可能的数值的非常有限的子集,并且以可能的结果值可能具有许多小数位的方式实现。

考虑:

printf("%5.18f\n", (float) 2.05);
printf("%5.18f\n", (float) 2.45);
printf("%5.18f\n", (float) 4200.75);
printf("%5.18f\n", (float) 37.89);
printf("%5.18f\n", (float) 1.2);
printf("%5.18f\n", (float) -1.2);

打印:

2.049999952316284180
2.450000047683715820
4200.750000000000000000
37.889999389648437500
1.200000047683715820
-1.200000047683715820

这些值与浮点数可以表示的代码位中的值非常接近。

如果需要更高的精度,请使用双精度。 比这更精确? 使用NSDecimalNumber。

并且,如果可以,请使用CoreData。 它使管理这类事情变得更加简单。

为什么绕圈转?

NSString *itemDistance = [NSString stringWithFormat:@"%.2f",[item distance]];
float questionDistance = [itemDistance floatValue];

.2表示我想要2个小数位。

什么是距离类型? 如果它是NSNumber的实例,那么我认为您编写的代码无效,请尝试

NSString *itemDistance = [[item distance] stringValue];
float questionDistance = [itemDistance floatValue];

甚至

float q=[[item distance] floatValue];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM