我想问一下 double 如何处理它们的精度。
我创建了一个示例,其中输入了如下 double 值:
double d = 2.0126161;
double d1 = 2.0126162;
double d2 = 2.0126163;
double d3 = 2.0126164;
double d4 = 2.0126165;
当前输出:
如果我设置断点并通过在 lldb 中运行“po”命令进行检查,则值显示如下:
(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
我将这些 double 分配给 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
注意:请注意,我不想在屏幕上显示这个值,我使用这些 double 值进行数学计算,所以没有意义通过传递“转换为 NSString %.7f"作为 NSString 的格式说明符。
最佳答案
您遇到的情况很正常,必须将无限数量的数字映射到一定数量的字节。因此,您通常不会得到输入的确切数字,而是可以用所选数字格式表示的下一个最接近的数字。
对于数学计算,请使用 NSDecimalNumber .
关于iOS:限制数据类型 "double"的精度而不转换为 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29764054/