iOS:限制数据类型的精度" double"没有转换为NSString

时间:2015-04-21 05:57:44

标签: ios objective-c double precision double-precision

在这里,我正在查询double如何使用它们的精度。

我创建了一个示例,其中输入了以下双值:

double d = 2.0126161;
double d1 = 2.0126162;
double d2 = 2.0126163;
double d3 = 2.0126164;
double d4 = 2.0126165;

当前输出:

如果我把断点和运行" po"在lldb中的命令然后值显示如下:

(lldb) po d
2.0126160999999998

(lldb) po d1
2.0126162000000001

(lldb) po d2
2.0126162999999999

(lldb) po d3
2.0126164000000002

(lldb) po d4
2.0126165

我将这些双打分配给CLLocation对象的纬度和经度,其数据类型为" double"。

在这里,你可以看到输出,显示d4的“po”命令打印值“2.0126165”,这与我们明确给d4的值相同,这是完全正常的和我想要的。

问题:

但是d,d1,d2,d3的“po”命令与我们明确传递的值相比,值有变化。

d,d1,d2,d3的值的这种变化在我们涉及双d,d1,d2,d3的计算中产生差异。如果我们检查累积效应,则表明与我们预期的输出相比存在显着差异。

我不想将值四舍五入到特定的小数位数,因为它会因值而异。

如何使d,d1,d2,d3具有与显式初始化时相同的值,而不是使用数据类型double更改精度(检查下面的预期输出)?

预期输出:

(lldb) po d
2.0126161

(lldb) po d1
2.0126162

(lldb) po d2
2.0126163

(lldb) po d3
2.0126164

(lldb) po d4
2.0126165

注意:请注意我不想在屏幕上显示此值,我使用这些双值进行数学计算,因此没有点转换为NSString传递"%。7f"作为NSString的格式说明符。

2 个答案:

答案 0 :(得分:1)

您所经历的是正常的,有无限数量的数字必须映射到一定数量的字节。因此,您通常不会得到您输入的确切数字,但下一个最接近的数字可以用所选的数字格式表示。

对于数学计算,请使用NSDecimalNumber

答案 1 :(得分:0)

您正在使用 CLLocation ,其类型属性(纬度和经度)。

double 类型默认使用小数点后的16位数。要获得您指定的确切值,请执行以下操作:

double d = 2.0126161000000000; 

对于其余数字,请使用0并将长度调整为16。

希望这会有所帮助。