将NSString转换为float,结果是错误的

时间:2015-12-22 03:24:33

标签: ios objective-c

以下是代码:

NSString *val = @"51785239";
unsigned long long valFromFloat = 0L;
unsigned long long valFromLL = 0L;
valFromFloat = [val floatValue];
valFromLL = [val integerValue];

我正在测试此代码,结果是:valFromFloat = 51785240.0,valFromLL = 51785239。

为什么valFromFloat是51785240.0?我认为它应该是51785239.0。

请有人解释一下吗?

4 个答案:

答案 0 :(得分:1)

您似乎对浮点与整数类型感到困惑,并且误解了浮点精度。

  

为什么valFromFloat是51785240.0?

不是。 valFromFloat是整数类型的变量,特别是unsigned long long,因此它的值当然没有小数部分。

声明:

valFromFloat = [val floatValue];

首先调用一个方法将字符串值val解析(解释)为float值,这是低精度浮点类型。然后,float值会转换为unsigned long long值并存储到valFromFloat

尝试:

float asFloat = [val floatValue];
double asDouble = [val doubleValue];
int asInt = [val intValue];
NSLog(@"float: %f | double: %f | int: %d", asFloat, asDouble, asInt);

看看你得到了什么。然后查找浮点精度以及二进制浮点(例如类型floatdouble)和十进制浮点类型(例如NSDecimal和{{1})之间的差异}。

HTH

答案 1 :(得分:1)

漂浮物 来自 MacTypes.h 的屏幕截图。 enter image description here

我们可以看到浮点数【Float32】是32位IEEE浮点数:1个符号位,8个指数位,23个小数位。

我们可以从https://en.wikipedia.org/wiki/Single-precision_floating-point_format

获得波纹管图像

enter image description here

enter image description here

然后我们可以将字符串转换为float,如下所示:

51785239(10)=11000101100010111000010111(2)

此外,IEEE 754 binary32格式要求您以enter image description here格式表示实际值,以便11000101100010111000010111向右移动25位数,以成为enter image description here

我们从中推断:

指数为25(因此,偏差形式为152 = 1001 1000) 分数是1000101100010111000011000(向二进制点的右边25位寻找四舍五入到1000101100010111000011000)

因此:
enter image description here

答案 2 :(得分:0)

更改

valFromFloat = [val floatValue];

valFromFloat = [val doubleValue];

(并考虑浮动是什么)。

答案 3 :(得分:-1)

NSString *string_val =@"51785239.65";
float float_val=[string_val floatValue];
相关问题