Objective c NSString中的精确浮点值

Objective c NSString中的精确浮点值,objective-c,floating-point,rounding,foundation,Objective C,Floating Point,Rounding,Foundation,f是37.3335991 除了我自己舍入外,还有什么方法可以从NSString中获得精确的浮点值吗?使用[NSDecimalNumber decimalNumberWithString:locale:][/code>。这将使数字保持十进制格式,而不是二进制格式。不容易。NSString中表示的数字完全可能没有作为基本浮点类型的精确表示 如果您知道您的输入永远不会超过某个长度,并且不需要解析为原始浮点类型,那么您可以使用类似(适用于最多38位数字)的方法,或者自己实现一个类似的实用程序,其中记录小

f是37.3335991


除了我自己舍入外,还有什么方法可以从NSString中获得精确的浮点值吗?

使用
[NSDecimalNumber decimalNumberWithString:locale:][/code>。这将使数字保持十进制格式,而不是二进制格式。

不容易。
NSString
中表示的数字完全可能没有作为基本浮点类型的精确表示

如果您知道您的输入永远不会超过某个长度,并且不需要解析为原始浮点类型,那么您可以使用类似(适用于最多38位数字)的方法,或者自己实现一个类似的实用程序,其中记录小数点的位置,将数字解析为整数,并在需要打印时在正确位置重新插入小数点

或者,如果您的输入长度是不受限制的,那么您唯一可以真正尝试的就是使用任意精度的算术库


请注意,使用这些方法中的任何一种,您仍然无法构造保证与输入完全匹配的基本浮点值。如果您需要精确的精度,那么您就不能简单地依赖于
float
double

这两种方法,但仍然存在一个问题:如何将字符串转换为float,使其达到37.33360000?NSNUmber.floatValue仍然给出37。3335991@Yaro这个答案的要点是,如果您需要使用十进制表示法(即,您需要以10为底的特定数字),那么您需要使用NSDecimalNumber。不能将其转换为浮动。浮点数不存储在基10中。因此,最好的方法是编写一个函数,将基10 NSNumber 37.3336转换为浮点数37.333600?一定有更好的办法。@Yaro没有“float 37.333600”这样的东西。这和“十进制的1/3”是一样的。十进制数字不能精确地表示某些分数。同样,二进制浮点不能精确地表示37.3336。如果需要实际数字37.3336,则不能直接使用float。可以使用小数,也可以缩放所有对象并使用Int,或者在显示期间应用舍入。但不能将其直接转换为浮点数;请参阅链接答案了解更多信息,以及最著名的答案。
NSString *str = @"37.3336";
float f = [str floatValue];