float vs NSDecimalNumber计算

时间:2015-06-20 13:06:23

标签: objective-c

我有一个简单的例子来比较使用foat和NSDecimalNumber:

    NSDecimalNumber *n1 = [[NSDecimalNumber alloc] initWithDouble:33.23];
    NSDecimalNumber *n2 = [[NSDecimalNumber alloc] initWithDouble:78.35];

    NSDecimalNumber *n3 = [n1 decimalNumberByDividingBy:n2];

    NSLog(@"decimalNumber n3 %@", n3);


    double d1 = 33.230000000000000;
    double d2 = 78.350000000000000;

    double d3 = d1/d2;

    NSLog(@"double d3 %f", d3);

结果:

 decimalNumber n3 0.42412252712188889444798978940650925335
 double d3 0.424123

问题:

  1. 为什么我的结果不一样?我认为浮动分区围绕结果,我们可以用浮点数进行除法而不用舍入结果吗?

2 个答案:

答案 0 :(得分:2)

我认为它更多的是NSLog问题,而非四舍五入问题。

尝试记录[n3 doubleValue]

NSLog(@"decimalNumber n3 %f", [n3 doubleValue]);

答案 1 :(得分:2)

这是由于两种类型的精度,位数和基数之间的差异。 doublefloat内部使用基数为2且精度较低,NSDecimalNumber使用基数10且精度更高。它类似于分数和小数,例如,1/3和0.333333333333333333不完全相同。在网络上有大量的答案和更广泛的答案,以及介绍性的CS教科书,这些都是更精细的细节。 HTH