解析iOS-SDK - 添加零的十进制数

时间:2016-01-06 14:53:57

标签: ios objective-c parse-platform nsnumber

我在Parse中有一个产品列表,格式是这样的;

{
    Environment = Both;
    "Ground_indoor" = Finished;
    "Ground_outdoor" = Finished;
    "Max_Working_Height" = "9.800000000000001";
    Name = "8m Battery Scissor Lift - Genie GS2632";
    "Non_Marking_Tyres" = 1;
    "Platform_Length" = "2.26";
    "Platform_Type" = "Scissor Lift";
    "Platform_Width" = "0.8100000000000001";
    "Tax_Class" = E;
    Weight = 1956;
}

然而由于一些奇怪的原因,任何带有“8”的东西都会在它们之间添加一些随机零。例如,Platform_Width实际上是;

http://puu.sh/mlGLo/be9f200472.png

任何线索?

1 个答案:

答案 0 :(得分:0)

是的,这是由于浮点不准确造成的。您可能会发现有关它的非常学术性的解释here

或者,如果这是太多无法阅读,让我们简单地这样说 - 例如,让我们以值0.81为例。浮点数无法准确表示该数字,并且向上舍入为0.8100000000000001,因为int值为81由二进制值1010001表示。为了使值为0.81,如果您可以采用81 x 10 ^ -2将是准确的(= 81/10 ^ 2。)但这是不可能的,因为你必须使用基数2而不是10.所以最接近10 ^ 2 = 100将是128 = 2 ^ 7。对于值81(1010001),您需要的总位数为9:6,对于值7(111),为3位。那么值81 x 2 ^ -7并不严重不准确。因此,为了改善这种不准确性,我们可以将值81和7更改为其他值。因此,您的值的公式将是X = A x 2 ^ B,其中A和B是正或负的整数值。数字越高,精度越高。但是,如您所知,表示值A和B的位数是有限的。对于float,总数为32. Double为64,Decimal为128.

希望这能解释你的问题。