Имея в виду ошибок округления, большинство с плавающей точкой числа в конечном итоге несколько неточное. Пока эта неточность остается маленькой, ее обычно можно игнорировать. Однако это также означает, что числа, ожидаемые равными (например, при вычислении одного и того же результата с помощью разных правильных методов), часто несколько отличаются друг от друга, и простой тест равенства терпит неудачу.
И в вашем случае, превращение double
в float
теряет некоторую точность.
Вы должны быть очень осторожны при сравнении плавающих точек.
Я предлагаю вам взглянуть на эту ссылку: What is the most effective way for float and double comparison?
Эта статья может помочь вам понять, почему он добавляет: http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html
Небольшое пояснение о числах с плавающей точкой, и почему это :
Номера с плавающей запятой, как правило, упакованы в компьютерную дату в виде знака , expone nt поле, и Значимость (мантисса), слева направо.
В принципе, можно сказать, что число с плавающей точкой:
number = (sign ? -1:1) * 2^(exponent) * 1.(mantissa bits)
Конечно, в зависимости от того, если вы используете поплавок или двойной, точность отличается:
| Sign | Exponent | Significand | Total bits
float | 1 | 8 | 23 | 32
Double | 1 | 11 | 52 | 64
Здесь вы можете увидеть, почему вы можете потерять некоторые данные, конвертировав double в float.
В вашем случае, кажется, что компьютер способен точно вычислить 3.5, но не 3.3. Так или иначе, с формулой, мы можем предположить, что вы делаете что-то вроде:
3.3333333 == 3.333333333333333 // is false because of the precision
3.5000000 == 3.500000000000000 // is true
// I tried to match the precision of the float in the left
// and the precision of the double on the right
Почему бы хранить булев результат операции равенства в виде числа с плавающей точкой? –
Также вы можете прочитать [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –
И, в-третьих, узнайте разницу между 'float' и' double', как в общем, так и в литературе. –