【问题标题】:Calculation of sum incorrect when digits over 10 million [duplicate]当数字超过1000万时,总和计算不正确[重复]
【发布时间】:2013-04-07 17:50:29
【问题描述】:

我有一个文本字段(仅限数字)和一个 UILabel,我使用按钮将它们添加在一起。 UILabel 显示答案,文本字段在计算时变为空白。提到的计算和功能都可以正常工作,直到我开始想要添加超过 1000 万的数字。 UILabel 显示的答案为 -2147483648。我为得到这个结果所做的计算是 0 + 1000000000。

我没有对任一字段的字符长度设置任何限制,所以不确定为什么会发生这种情况。

这是我的计算代码:

-(IBAction)addtotal2;{

float x = ([numberTextField.text floatValue]);
float y = ([dtotal.text floatValue]);
dtotaler = x + y;
dtotal.text = [NSString stringWithFormat:@"%d",dtotaler];
numberTextField.text = @"";
NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSString stringWithFormat:@"%i",dtotaler] forKey:@"saveDtotal"];
[userDefaults synchronize];

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ios objective-c xcode


    【解决方案1】:

    您遇到了溢出。

    使用double 而不是float,您应该可以解决问题。

    double x = ([numberTextField.text doubleValue]);
    double y = ([dtotal.text doubleValue]);
    

    编辑

    如 cmets 中所述,问题可能是 dtotaler 变量上的整数溢出,即它可能是 int 太小而无法保存结果。

    如果是这种情况,请将dtotaler 的类型更改为NSInteger,这在iOS 上是long 的类型同义词

    #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
    typedef long NSInteger;
    typedef unsigned long NSUInteger;
    #else
    typedef int NSInteger;
    typedef unsigned int NSUInteger;
    #endif
    

    【讨论】:

    • 更可能是整数溢出 :-)(-2147483648 是 -2^31,如果是整数,则为 %d 格式)
    • 你是对的。添加到帖子中;)
    • 在这里使用double 无济于事,因为dtotaler 可能是int
    • 非常感谢老兄,这行得通。但是现在它的任何数字都超过 100 亿,我怀疑我是否需要它,但以防万一有这么大的数字的想法?
    • @Mustafa:使用long long int(大约19个十进制数字)或NSDecimalNumber(大约38个十进制数字)。
    【解决方案2】:

    您应该使用double 来表示较大的值,因为float32-bit,double 是64-bit,并且可以包含较大的值。

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多