# V3040. The expression contains a suspicious mix of integer and real types.

The analyzer detected a possible error in an expression where integer and real data types are used together. Real data types include types 'float' and 'double'.

Consider the following example taken from a real application:

    public long ElapsedMilliseconds { get; }
    ....
    var minutes = watch.ElapsedMilliseconds / 1000 / 60;
    Assert.IsTrue(minutes >= 0.95 && minutes <= 1.05);

The 'minutes' variable is of type 'long', and comparing it with values 0.95 and 1.05 does not make sense. The only integer value that fits into this range is 1.

The programmer probably expected the result of integer division operation to be a value of type 'double', but it is not so. In the example above, integer division produces an integer value, which is assigned to the 'minutes' variable.

This code can be fixed by explicitly casting the number of milliseconds to type 'double', before the division operation:

    var minutes = (double)watch.ElapsedMilliseconds / 1000 / 60;
    Assert.IsTrue(minutes >= 0.95 && minutes <= 1.05);

The quotient will now be more accurate, and the 'minutes' variable will be of type 'double'.

This diagnostic is classified as:

CWE-682

You can look at examples of errors detected by the V3040 diagnostic.