Objective c 小数乘法奇异性

Objective c 小数乘法奇异性,objective-c,cocoa-touch,nsdecimalnumber,Objective C,Cocoa Touch,Nsdecimalnumber,排他性价格、数量均为小数 NSDecimalNumber *price = [exclusivePrice decimalNumberByMultiplyingBy:quantity]; NSLog(@"%@ * %@ = %@", exclusivePrice, quantity, price); 我得到的结果是: 2010-04-05 00:22:29.111 TestApp[13269:207] 65 * 2 = -0.0000000000000000000000000000000000

排他性价格、数量均为小数

NSDecimalNumber *price = [exclusivePrice decimalNumberByMultiplyingBy:quantity];
NSLog(@"%@ * %@ = %@", exclusivePrice, quantity, price);
我得到的结果是:

2010-04-05 00:22:29.111 TestApp[13269:207] 65 * 2 = -0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007169919476068871316457914368
我所期望的是:

2010-04-05 00:22:29.111 TestApp[13269:207] 65 * 2 = 130
有人能解释一下吗

编辑:

完全复制:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSDecimalNumber *n2 = (NSDecimalNumber *)[formatter numberFromString:@"2"];
NSDecimalNumber *n1 = (NSDecimalNumber *)[NSDecimalNumber numberWithInt:65];
NSDecimalNumber *n3 = [n1 decimalNumberByMultiplyingBy:n2];
NSLog(@"%@ * %@ = %@", n1, n2, n3);

似乎对我有用。

NSDecimalNumber * n1 = [NSDecimalNumber decimalNumberWithString:@"65"];
NSDecimalNumber * n2 = [NSDecimalNumber decimalNumberWithString:@"2"];

NSDecimalNumber * res = [n1 decimalNumberByMultiplyingBy:n2];

NSLog(@"%@ * %@ = %@", n1, n2, res);
输出:

2010-04-05 08:40:42.812 x[24301] 65 * 2 = 130

我找到了答案:根据我的数据,我不能轻易地在NSNumber和NSDecimalNumber之间转换。要从一个转换为另一个,我必须执行以下操作:

NSDecimalNumber *n2 = [NSDecimalNumber decimalNumberWithDecimal:
                              [[formatter numberFromString:@"2"] decimalValue]];

如果NSNumberFormatter有一个decimalNumberFromString:方法就好了。

是的,我很困惑。我现在在另一个项目中尝试了同样的方法,它对我也很有效。不知何故,这在我的项目中并不起作用。在项目失败时,如何初始化这些值?我在问题中添加了完整的重新编程。我推测从格式化程序进行强制转换时出现了问题?当您使用
NSNumberFormatter
时,它返回的
NSNumber
对象与
NSDecimalNumber
不同。查看ref
NSNumber
不会定义任何算术运算,因此如果可能,请使用
NSDecimalNumber
decimalnumberwhithstring
获取正确的对象,以便稍后传递给
decimalNumberByMultiplyingBy
对象。谢谢Stefan。我假设,由于NSNumber是NSDecimalNumber的超类,我可以在作业中简单地强制转换。演员阵容有点有效(正如NSLog所显示的),但后来会导致这些奇怪的问题。我只是在看。似乎NSNumber用于格式化和简单比较,NSDecimalNumber用于使用十进制数的算术运算。所以,虽然可以从字符串创建NSDecimalNumber,但不能从double或float创建,但可以从int或float创建NSNumber。。。