以下是代码:
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。
请有人解释一下吗?
答案 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);
看看你得到了什么。然后查找浮点精度以及二进制浮点(例如类型float
和double
)和十进制浮点类型(例如NSDecimal
和{{1})之间的差异}。
HTH
答案 1 :(得分:1)
我们可以看到浮点数【Float32】是32位IEEE浮点数:1个符号位,8个指数位,23个小数位。
我们可以从https://en.wikipedia.org/wiki/Single-precision_floating-point_format
获得波纹管图像然后我们可以将字符串转换为float,如下所示:
51785239(10)=11000101100010111000010111(2)
此外,IEEE 754 binary32格式要求您以格式表示实际值,以便11000101100010111000010111向右移动25位数,以成为
我们从中推断:
指数为25(因此,偏差形式为152 = 1001 1000) 分数是1000101100010111000011000(向二进制点的右边25位寻找四舍五入到1000101100010111000011000)
答案 2 :(得分:0)
更改
valFromFloat = [val floatValue];
到
valFromFloat = [val doubleValue];
(并考虑浮动是什么)。
答案 3 :(得分:-1)
NSString *string_val =@"51785239.65";
float float_val=[string_val floatValue];