在我的应用程序中,我只是将 50 除以 3,我想存储它的确切结果值。如果我使用 float 它给出 16.666666,如果我使用 double 那么它给出 16.666667。
实际上,我通过划分框架的高度在一个框架内创建三个标签,我决定每个标签的高度。所以我没有得到确切的值,它会在标签之间产生间隙。如果我通过 60,那么它工作正常,因为 60/3 结果为 20,但如果我通过 50,则存在间隙。
在我的应用程序中,我只是将 50 除以 3,我想存储它的确切结果值。如果我使用 float 它给出 16.666666,如果我使用 double 那么它给出 16.666667。
实际上,我通过划分框架的高度在一个框架内创建三个标签,我决定每个标签的高度。所以我没有得到确切的值,它会在标签之间产生间隙。如果我通过 60,那么它工作正常,因为 60/3 结果为 20,但如果我通过 50,则存在间隙。
如果你想让你的框架分成三个等高的区域,那么你的框架的高度(以像素为单位)需要被三整除。您不能显示小数像素,它们不可分割;每个以像素为单位的高度都需要是一个整数。
存储“精确”值的唯一方法是创建一个名为“Rational”(或类似)的类,并将分数的分子和分母存储为单独的 ivars。Floats
和doubles
(或任何文字的计算机表示)不能存储具有无限个小数位的有理数或超越实数。
使用“Rational”类的方法是存储分子和分母,然后将适当的数学应用于这些值(如果您希望通过程序传播“精确性”)。稍微简单的方法是将有理数显示为分子和分母,但使用float/double
基础数学的近似值。
float t= (float)50/3;
long double t1= (long double)50/3;
NSLog(@"%.30f %.30LF",t, t1);
产生输出“16.666666030883789062500000000000 16.666666666666666666088425508008”。
我建议您使用不精确但足够精确的 long double。