Nei*_*eil 6 iphone xcode cocoa cocoa-touch ios
我想知道是否有一种方法可以轻松安全地纠正浮点数.
例如,
输入时:"32 + 32.1"结果:"64.0999999999999"
此外,我必须提到,使用科学记数法时,这种情况经常发生."(2.3*10 ^ 23)*(1.452*10 ^ 23)"返回:"3.339599999999999999e + 46"
最后,有时返回的数字是:ex.123.0000000000001
谢谢您的帮助!
编辑
得到批准的答案很棒.但我发现对我有用的是在NSString stringWithFormat中使用%g和double.%g似乎非常恰当地围绕一切.恩.
answer.text = [NSString stringWithFormat@" %g ", doubleAnswer];
Run Code Online (Sandbox Code Playgroud)
在计算中使用双打,然后使用该方法似乎对我有用,我希望这对其他人也有帮助.如果这不是您要找的答案,请查看已批准的答案!
浮点数不能很好地代表具体数字.使用double会使这种情况发生的频率降低,但你仍然会遇到问题.有关如何存储浮点数的技术说明(以及我们首先遇到此问题的原因)请参阅此维基百科文章: IEEE 754-1985.(基本上,浮点数存储为值的二进制表示,并且只有很多位可供使用,因此它们很快耗尽并且必须舍入到它们能够表示的最接近的值.)
通常情况下,您不必担心+/- .0000001,只需要在具有适当小数点数的用户显示它们时格式化它们,它就会被舍入.在内部,它的存储方式并不重要.
例如,如果要显示"结果",可以执行以下操作:
float myFloat = 32 + 32.1;
NSString *result = [NSString stringWithFormat:%@"%.2f", myFloat];
// result will contain 64.10
Run Code Online (Sandbox Code Playgroud)
如果您不想要固定数量的小数点,您还可以使用浮点到字符串转换功能NSNumber
:
float myFloat = 32 + 32.1;
NSNumber *myNumber = [NSNumber numberWithFloat:myFloat];
NSString *result = [myNumber stringValue];
// result will contain 64.1
Run Code Online (Sandbox Code Playgroud)
NSDecimalNumber
将为您处理所有这些,但它涉及更多,涉及更多的开销,但这是一个让你开始的例子:
NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"32"];
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"32.1"];
// Or since you use exponents:
// NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithMantissa:321 exponent:-1 isNegative:NO];
NSDecimalNumber *myNumber = [num1 decimalNumberByAdding:num2];
NSString *result = [myNumber stringValue];
// result will contain 64.1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
402 次 |
最近记录: |