【问题标题】:Converting NSString to float produces inexact value将 NSString 转换为浮点数会产生不精确的值
【发布时间】:2012-02-26 16:50:53
【问题描述】:

我的视图中有两个文本字段。在提示用户输入一个值后,我将它们转换为floats 进行计算。

我使用以下代码:

variable1 = [textField1.text floatValue];
variable2 = [textField2.text floatValue];`

当用户在textField1 中输入22.8 时,我在variable1 中得到22.80005。

我没有得到确切的值!

如何获得准确的十进制值?任何添加都可能影响计算的准确性。

【问题讨论】:

    标签: cocoa cocoa-touch floating-point nsstring numbers


    【解决方案1】:

    还有一个关于浮点精度的问题!

    你应该改用NSDecimalNumber

    NSDecimalNumber *variable1 = [NSDecimalNumber decimalNumberWithString:[textField1 text]];
    NSDecimalNumber *variable2 = [NSDecimalNumber decimalNumberWithString:[textField2 text]];
    

    Number and Value Programming Guide. 中有更多信息

    【讨论】:

      【解决方案2】:

      您不能:根据定义,浮点数不是精确值,只是估计值。你应该得到这样的偏差。

      【讨论】:

        【解决方案3】:

        这取决于你在做什么计算。

        货币使用NSDecimalNumber。 对于其他计算,请使用 double 而不是 float。当数字从十进制转换为二进制时,会出现精度问题。 double 将为您提供更好的精度(不精确但更精确),它应该足以满足您想要做的任何事情。

        有一些方法可以在计算机上进行精确计算,但它们更复杂,而且总是比 floatdouble 慢得多。

        【讨论】:

        • 比较怎么样...我有一个应用程序,我需要在其中比较十进制值。该结构使得值采用字符串格式,当我将字符串转换为浮点数时,精度不准确,例如将 -0.123456 从字符串转换为双精度返回 -0.12345 但我需要准确的值..在这种情况下我应该做什么
        • 通常您只需要在货币计算中使用精确值。使用定点算术可以得到精确的数字(基本上你使用带有固定小数位数的longlong long)。或者你可以使用专为它设计的NSDecimalNumber
        • 实际上数值在小数点后的位数不同,有的有 6 有的有 9 有的有 5 ,像这样
        • 使用NSDecimalNumber 或阅读有关实现定点算术的内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        相关资源
        最近更新 更多