Objective c division of two ints

前端 未结 4 2038
臣服心动
臣服心动 2020-12-10 07:24

I\'m trying to produce a a float by dividing two ints in my program. Here is what I\'d expect:

1 / 120 = 0.00833

Here is the code I\'m using:

相关标签:
4条回答
  • 2020-12-10 08:05

    Do the following

    float a = 1./120.
    
    0 讨论(0)
  • 2020-12-10 08:13
    float a = 1/120;
    float b = 1.0/120;
    float c = 1.0/120.0;
    float d = 1.0f/120.0f;
    
    NSLog(@"Value of A:%f B:%f C:%f D:%f",a,b,c,d);
    
    Output: Value of A:0.000000 B:0.008333 C:0.008333 D:0.008333
    

    For float variable a : int / int yields integer which you are assigning to float and printing it so 0.0000000

    For float variable b: float / int yields float, assigning to float and printing it 0.008333

    For float variable c: float / float yields float, so 0.008333

    Last one is more precise float. Previous ones are of type double: all floating point values are stored as double data types unless the value is followed by an 'f' to specifically specify a float rather than as a double.

    0 讨论(0)
  • 2020-12-10 08:16

    In C (and therefore also in Objective-C), expressions are almost always evaluated without regard to the context in which they appear.

    The expression 1 / 120 is a division of two int operands, so it yields an int result. Integer division truncates, so 1 / 120 yields 0. The fact that the result is used to initialize a float object doesn't change the way 1 / 120 is evaluated.

    This can be counterintuitive at times, especially if you're accustomed to the way calculators generally work (they usually store all results in floating-point).

    As the other answers have said, to get a result close to 0.00833 (which can't be represented exactly, BTW), you need to do a floating-point division rather than an integer division, by making one or both of the operands floating-point. If one operand is floating-point and the other is an integer, the integer operand is converted to floating-point first; there is no direct floating-point by integer division operation.

    Note that, as @0x8badf00d's comment says, the result should be 0. Something else must be going wrong for the printed result to be inf. If you can show us more code, preferably a small complete program, we can help figure that out.

    (There are languages in which integer division yields a floating-point result. Even in those languages, the evaluation isn't necessarily affected by its context. Python version 3 is one such language; C, Objective-C, and Python version 2 are not.)

    0 讨论(0)
  • 2020-12-10 08:27

    You need to specify that you want to use floating point math.

    There's a few ways to do this:

    • If you really are interested in dividing two constants, you can specify that you want floating point math by making the first constant a float (or double). All it takes is a decimal point.

      float a = 1./120;
      

      You don't need to make the second constant a float, though it doesn't hurt anything.

    • Frankly, this is pretty easy to miss so I'd suggest adding a trailing zero and some spacing.

      float a = 1.0 / 120;
      
    • If you really want to do the math with an integer variable, you can type cast it:

      float a = (float)i/120;
      
    0 讨论(0)
提交回复
热议问题