2014-02-21 3 views
-4

Ниже заставляет меня путать -Путаница C++ операции умножения

Если умножить float с 10 (integer) посмотреть, что случилось, также эти виды деятельности кажется странным!

#include <iostream> 
using namespace std; 

int main() 
{ 
    float x1 = 0.1;// x1 *10 = 1 ture 
    float x2 = 0.7;//x2 *10 = 7 false answer give 0.6 
    float x3 = 0.8;//x3 *10 = 8 true 
    float x4 = 0.9;// x4 * 10 = 9 false ops! the answer is 8 
    int f = x4 * 10 ; 
    cout<<f ; 

    return 0; 
} 

Может ли кто-нибудь объяснить?

+0

Ну, [ideone] (http://ideone.com/P4cCX2) выводит '9'. –

+1

Вы сохраняете возвращаемое значение как int не как float. – woodlumhoodlum

+0

Вы копируете тот же код? –

ответ

0

поплавки всегда округляется вниз (13,999999 есть 13 целое число). Арифметика с плавающей точкой подвержена незначительным ошибкам округления. Попробуйте следующее:

int f = (x4 * 10) + 0.5; 

Он будет работать только с положительными цифрами, но докажет, как это сделать.

0

Вы используете int для типа f, поэтому точность теряется. Попробуйте с:

float f = x4 * 10.0; 

и повторите попытку.

3

Поскольку Вы пытаетесь сохранить результат в int, не float. Это вырезает часть с плавающей точкой, удерживая только целую часть, например. (int) 6.999 = 6.

Если вы хотите получить ожидаемый результат, вы должны, по крайней мере, вокруг него:

int f = x4 * 10 + 0.5; 
       ^^^^^ 
        | +0.5 here to round it 

Примечание:, как прокомментировал @JamesKanze, так как есть multiple definitions of rounding, +0.5может не работает для отрицательных чисел (вместо этого используйте -0.5). Чтобы облегчить вашу работу, есть также std:round(), который вы можете использовать с C++11).

Или сохранить его как то, что должно быть, т.е. float:

float f = x4 * 10; 
^^^^^ 

P.S .: Чтобы читать, проверить What Every Computer Scientist Should Know About Floating-Point Arithmetic.

+2

В C++ 11 есть функция 'std :: round'. Например, добавление '0,5' не работает для отрицательных чисел. –

+0

@JamesKanze Обновлено. Спасибо за указание на это. – herohuyongtao

-1

Поплавковые номера не могут точно представлять числа. Например, рассмотрим выражение 1/3

Вы назначаете результат умножения на интегральную переменную. в этом случае число с плавающей точкой усекается, поскольку его фракция отбрасывается.

Используйте вместо

float f = x4 * 10 ; 
+2

'Номера с плавающей точкой не могут точно представлять числа'. Есть много, много чисел, которые они могут точно представлять просто отлично. –

+0

@LightnessRacesinOrbit Фактически, каждое число с плавающей запятой (кроме бесконечностей и NaN) точно представляет собой число. Проблема только в обратном: не каждое число может быть представлено числом с плавающей запятой. –

+1

@JamesKanze Вот что он сказал! –

Смежные вопросы