首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Objective-C (或C)中浮点数的正确用法和格式

Objective-C (或C)中浮点数的正确用法和格式
EN

Stack Overflow用户
提问于 2009-09-03 18:21:19
回答 3查看 2.8K关注 0票数 3

我有一个iPhone应用程序。我在我的sqlite3数据库中存储了一个浮点值(距离)。(数据库中的字段被格式化为浮点型)我能够在数据库中正确地存储浮点值,没有问题。然而,我似乎想不出如何将值从db格式中提取出来并正确地表示出来。下面是我的代码,用于从我的数据库中提取值并使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *itemDistance = [NSString stringWithFormat:@"%f",[item distance]];
float questionDistance = [itemDistance floatValue];

项目距离是一个浮点值。我不能让这个起作用。取而代之的是一个非常长的值。我做错了什么?任何帮助都将不胜感激。

提前感谢你的帮助,

L.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-03 19:30:52

假设你的-distance方法返回了正确的值,那么这听起来就像是对C语言中浮点数的工作原理的基本误解。每个开发人员至少落入这种陷阱一次。

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

这样做的原因是因为浮点数只有32位;4个字节。现在,在0..1000000或0..1000或偶数0..1之间有多少个带小数点的数字。无限的。浮点数实现了可能数值的一个非常有限的子集,并且以这样的方式实现,其中得到的可能值可能有许多小数位。

考虑一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);

这将打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2.049999952316284180
2.450000047683715820
4200.750000000000000000
37.889999389648437500
1.200000047683715820
-1.200000047683715820

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-08-09 13:14:13

为什么要绕圈子呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *itemDistance = [NSString stringWithFormat:@"%.2f",[item distance]];
float questionDistance = [itemDistance floatValue];

.2说我想要两位小数。

票数 3
EN

Stack Overflow用户

发布于 2009-09-03 18:46:03

距离的类型是什么?如果它是NSNumber的一个实例,那么我认为你写的代码不会起作用,试试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *itemDistance = [[item distance] stringValue];
float questionDistance = [itemDistance floatValue];

甚至是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float q=[[item distance] floatValue];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1376926

复制
相关文章
Objective-C中的@property和@synthesize用法
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用。 功能:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如: 1、在头文件中: C代码   @property int count;   等效于在头文件中声明2个方法: C代码   - (int)count;   -(void)setCount:(int)newCount;   2、实现文件(.m)中 C代码  
用户1941540
2018/05/11
1.5K0
Objective-C中的继承和多态
   面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点。OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到。    说到继承呢,想到了一本书上是引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦。人和妖都属于动物类,但各自有各自
lizelu
2018/01/11
1.2K0
java中时间和浮点数格式设置
DecimalFormat df=new DecimalFormat("0.00");  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); float temp1=(float)file.getLen()/1024; if(temp1<1024){ System.out.println(df.format(temp1)+" KB"); }else if(temp1>=1024 && temp1<10485
闵开慧
2018/03/30
1.1K0
Objective-C中的hasPrefix
Objective-C中的hasPrefix hasPrefix:方法的功能是判断创建的字符串内容是否以某个字符开始,其语法形式如下:    -(BOOL)hasPrefix:(NSString*)aString;   其中,(NSString *)aString;用来指定字符串。该方法的返回值为BOOL,当BOOL为YES或者为1时,则字符串是以某个字符开始;当BOOL为NO或者为0时,则字符串不是以某个字符开始。  【示例】以下程序通过使用hasPrefix:方法来判断使用stringWithCSt
猿人谷
2018/01/17
8420
Objective-C中的深拷贝和浅拷贝
        在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝。说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配。对非容器类的深拷贝就是重写分配一块内存,然后把另一个对象的内容原封不动的给我拿过来。对容器类的深拷贝是对容器中的每个元素都进行拷贝,容器类的浅拷贝是对容器里的内容不进行拷贝,两个容器的地址是不同的,但容器里的所装的东西是一样的,在一个容器中修改值,则另一个浅拷贝的容器中的值也会变化。所以对非容器类看对象是否为深拷贝还是浅拷贝就得看对象的内存
lizelu
2018/01/11
1.2K0
C# 中?和??的用法
最近在看官方的源码时,经常看到有 Int? sum;  和 FileProvider = FileProvider ??builder.GetFileProvider(); 一个问号: 很多数据类型时
码农阿宇
2018/04/18
1.9K0
Objective-C中的内存管理
        在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的。OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象是时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现);当计数器为0时,该对象占用的内存空间会被收回。在NSObject类有一个retainCount方法,调用该方法
lizelu
2018/01/11
8120
Objective-C中的集合类
       下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习。 在Objective-C中的集合类中主要包括不可变的数组--NSArray,  可变的数组--NSMutableArray,   不可变的字典--NSDictionary,    可变的字典--NSMutableDictionary, 不可变的集合--NSSet,可变的集合--NSMutableSet。
lizelu
2018/01/11
1.1K0
Objective-C中的属性机制
        Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域。     实例变量的作用域如下:         1. @public : 共有的,该实例变量谁都可以访问;         2.@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中
lizelu
2018/01/12
1.3K0
Objective-C中NSInvocation的使用
第一个PerformaceSelector比较常用, 也比较简单。 但是这个方式最多只能传递2个参数
周希
2019/10/15
7490
Objective-C中的语法糖
  写这篇博客源于一个疑问:“WoK~, 这也行?!”。刚接触OC不久,今天做深浅拷贝的测试,无意中把获取NSArray的值写成了用下标获取的方式。当时把注意力放在了深浅拷贝的内存地址分析上了,就没太
lizelu
2018/01/11
1K0
Objective-C中实现Swift中的defer
defer 所声明的 block 会在当前代码执行退出后被调用。正因为它提供了一种延时调用的方式,所以一般会被用来做资源释放或者销毁,这在某个函数有多个返回出口的时候特别有用。
韦弦zhy
2019/12/26
1.3K0
Objective-C中实现Swift中的defer
dateDiff在Objective-C中的实现
在学习iOS App开发中遇到需要计算时间差并格式化输出的需求,没有现成的方法,需要结合NSCalendar和NSDateComponents来实现。所以干脆把代码封装成一个熟悉的dateDiff方法。不过这个方法跟VB和sql里的dateDiff还是有点不一样,虽然可以封装成完全一样,不过我觉得直接返回NSDateComponents会更方便,因为所需要的各种单位上的值都包含在其中了。 我是把代码封装到自己的一个工具类KRUtils里作为类方法,使用起来也很方便。代码如下: /* dateDiff 方
小李刀刀
2018/03/06
1.4K0
Objective-C中的Block(闭包)
        学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西。学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也支持闭包, 也就是OC中所提到的Block。 到底什么是闭包或者block呢?用大白话说就是匿名函数,也就是在函数中可以包含这函数。就是在函数中可以定义匿名函数然后在函数中调用。学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?看过Bloc
lizelu
2018/01/11
1.5K0
Objective-C中NSArray类的解读
    NSArray数组类是Objective-C语言中常用的也是重要的一个类,除了开发中常用到的一些基础功能,NSArray及其相关类中还封装了许多更加强大的功能。有机会总结了一下,与需要的朋友们分享。
珲少
2018/08/15
1.3K0
Objective-C中runtime机制的应用
        Objective-C是一种动态语言,所谓动态语言,是在程序执行时动态的确定变量类型,执行变量类型对应的方法的。因此,在Object-C中常用字符串映射类的技巧来动态创建类对象。因为OC的动态语言特性,我们可以通过一些手段,在程序运行时动态的更改对象的变量甚至方法,这就是我们所说的runtime机制。
珲少
2018/08/16
4080
Objective-C中runtime机制的应用
static在C和C++中的用法和区别
http://blog.csdn.net/skyereeee/article/details/8000512
bear_fish
2018/09/20
2.7K0
Objective-C中的类目,延展,协议
  Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上。在其他OOP语言中就没见过这些名词,刚看到这三个名词的时候,有种感觉这是不是学习的坎?这东西难不难?能不能学会?经过本人亲自验证,这三个东西理解起来还是蛮简单的,学过C++或者Java的小伙伴对比理解还是蛮轻松的。类目(Category)就是给已有的类扩充相应的方法,扩充的方法是公有的,类目还可以起到分模块的功能,下面会详细说到。 延展(Extension)
lizelu
2018/01/11
1.1K0
c语言浮点数输出格式的控制,c语言输出格式控制「建议收藏」
#:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;
全栈程序员站长
2022/09/15
2.3K0
【Objective-C】Objective-C语言的动态性
动态类型指对象指针类型的动态性,具体地说就是使用id类型将对象的类型推迟到运行时才确定,由赋给它的对象类型决定该对象类型(说起来怎么这么绕口),也就是说id修饰的对象是动态类型对象,其他在编译期指明类型的为静态类型对象,所以开发中如果不是涉及到多态,尽量还是使用静态的类型,这样编写错误,编译器会提前查出问题,可读性更高一点。
编程怪才-凌雨画
2020/10/10
1.8K0
【Objective-C】Objective-C语言的动态性

相似问题

Objective-C中的星号用法

20

Objective-C中"id“的用法?

41

如何格式化浮点数(Objective-C)

10

Objective-C中的WebSocket用法示例

10

Objective-C中的类别用法

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文