Ios NSNumber到NSDecimalNumber的转换问题

Ios NSNumber到NSDecimalNumber的转换问题,ios,objective-c,rounding,nsnumber,nsdecimalnumber,Ios,Objective C,Rounding,Nsnumber,Nsdecimalnumber,当我将NSNumber转换为NSDecimalNumber时,此转换通常不正确 当我把这个值转换成十进制或双精度时,我有一个像92.43这样的数字 [number decimalValue]或[number doubleValue]值更改为92.429999999 我做了很多事情,比如[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]它总是会向这个数字返回“92.429999” 如何使用NSNumber原始值十进制或双精

当我将
NSNumber
转换为
NSDecimalNumber
时,此转换通常不正确

当我把这个值转换成十进制或双精度时,我有一个像92.43这样的数字 [number decimalValue]或[number doubleValue]值更改为92.429999999

我做了很多事情,比如[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]它总是会向这个数字返回“92.429999”


如何使用NSNumber
原始值
十进制或双精度我不想使用“92.43”这个数字作为“92.43”。为什么这个值会改变?

如果您只需要打印这个数字,请尝试:

NSLog(@"%.2f", decimalNumber);
这将在两个小数点上对92.429999999进行四舍五入,结果为:

92.43


如果您只需要打印此号码,请尝试:

NSLog(@"%.2f", decimalNumber);
这将在两个小数点上对92.429999999进行四舍五入,结果为:

92.43


为什么会发生这种情况?

一个简单的解释是,它与计算机如何执行计算以及浮点数如何表示有关。大多数浮点数的表示方式都不够精确,因为它们需要无穷多的位数来表示,因此需要舍入(也称为舍入或舍入误差)

你能做什么?

如果您确实需要执行准确的计算(例如计算价格),则不应使用
NSNumber
,而应始终使用
NSDecimalNumber
,并将其用于所有计算。最安全的方法是从字符串创建它,例如:

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"];

如果精度不重要,您可以将结果格式化为固定的小数位数。在这种情况下,您可能还需要查看
NSDecimalNumberHandler
来定义舍入行为。

为什么会发生这种情况?

一个简单的解释是,它与计算机如何执行计算以及浮点数如何表示有关。大多数浮点数的表示方式都不够精确,因为它们需要无穷多的位数来表示,因此需要舍入(也称为舍入或舍入误差)

你能做什么?

如果您确实需要执行准确的计算(例如计算价格),则不应使用
NSNumber
,而应始终使用
NSDecimalNumber
,并将其用于所有计算。最安全的方法是从字符串创建它,例如:

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"];

如果精度不重要,您可以将结果格式化为固定的小数位数。在这种情况下,您可能还需要查看
NSDecimalNumberHandler
来定义舍入行为。

这个问题在其他语言中也很常见-尽管计算机尝试过,但它们的精度并不完美(对我们人类来说不幸的是:P)。一个简单的解决办法是在转换后对小数进行四舍五入。可能重复感谢Bucco。当我在四舍五入后添加或乘以两个小数时。但我想知道为什么这个值会发生变化,你说常见问题:)我得到了我的答案,谢谢。你知道有没有办法得到原始值而不是四舍五入。这不是你说的同一个问题@Petertuvai@zapdroid我知道你问了一个或多或少不同的问题,但我确实认为答案在链接的问题中——你的值没有改变,这只是数字的表示方式这个问题在其他语言中也很常见——尽管计算机尝试过,但它们的精确度并不完美(对我们人类来说很不幸:P)。一个简单的解决方法是在转换后对小数进行四舍五入。可能重复感谢Bucco。当我在四舍五入后添加或乘以两个小数时。但我想知道为什么该值会更改,您说常见问题:)我得到了我的答案,谢谢。你知道有没有办法得到原始值而不是四舍五入。这不是你说的同一个问题@Petertuvai@zapdroid我知道你问了一个或多或少不同的问题,但我确实认为答案在链接的问题中——你的值没有改变,这只是数字的表示方式我不想精确。那个值只是我问题的一个例子。那个值可以是92.4878。我不想精确。那个值只是我问题的一个例子。那个值可以是92.4878。